无法访问 C 中结构的值
Unable to access the values of a struct in C
我目前正在学习编写 C 代码,但我一直坚持在堆上创建结构。
我有以下代码:
#include <stdio.h>
typedef struct{
int a;
int b;
} some_struct;
int main(int argc, char ** argv) {
printf("%i", sizeof(some_struct));
some_struct * p_struct = malloc(sizeof(some_struct));
p_struct->a = 600;
p_struct->b = 100;
return 0;
}
但是执行时 Visual Studio 告诉我:
test.exe 中 0x00007FF6286C1E39 处的未处理异常:0xC0000005:访问冲突写入位置 0xFFFFFFFFAFBE4440。
调试器还告诉我a和b的内存都无法读取。我明白这两个整数应该是未初始化的,但为什么他们的内存看起来不可读?
查看您的地址,问题似乎是缺少 malloc()
的原型。做:
#include <stdlib.h>
隐式 int
导致 malloc()
返回的值被截断(假设 64 位地址和 32 位整数)。因此,从而产生无效地址。
在 C99 之前的版本中,如果未找到函数的原型,编译器会隐式声明带有 int
的原型。但这自 C99 以来不再有效。
你应该 #include <stdlib.h>
其中包含 malloc
。 Visual Studio 没有给你任何警告吗?
当您不包含 <stdlib.h>
时,malloc
被赋予 int
的隐式 return 类型。这个 可能 在 sizeof(int) == sizeof(some_struct*)
的平台上工作,但如果它们的大小不同(例如 32 位整数和 64 位指针),值 returned by malloc
在赋值前被截断。
错误消息中的值 (0xFFFFFFFFAFBE4440
) 表明是这种情况:malloc
returned 了一个值为 0x????????AFBE4440
的指针,这是截断为 0xAFBE4440
,在分配时符号扩展为 0xFFFFFFFFAFBE4440
。
发生这种情况是因为您调用了函数 malloc 但忘记(或者您不知道)包含 stdlib.h.
这是工作代码:
#include <stdio.h>
#include<stdlib.h>
typedef struct{
int a;
int b;
} some_struct;
int main(void) {
printf("%lu", sizeof(some_struct));
some_struct * p_struct = malloc(sizeof(some_struct));
p_struct->a = 600;
p_struct->b = 100;
return 0;
}
你可能注意到我改变了:
printf("%i", sizeof(some_struct));
有:
printf("%lu", sizeof(some_struct));
因为如果您打开编译器设置,您将获得:
format ‘%i’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Werror=format=]|
注意:
在这里使用 %i 而不是 %d 没问题,但与 scanf 不同。
我目前正在学习编写 C 代码,但我一直坚持在堆上创建结构。 我有以下代码:
#include <stdio.h>
typedef struct{
int a;
int b;
} some_struct;
int main(int argc, char ** argv) {
printf("%i", sizeof(some_struct));
some_struct * p_struct = malloc(sizeof(some_struct));
p_struct->a = 600;
p_struct->b = 100;
return 0;
}
但是执行时 Visual Studio 告诉我:
test.exe 中 0x00007FF6286C1E39 处的未处理异常:0xC0000005:访问冲突写入位置 0xFFFFFFFFAFBE4440。
调试器还告诉我a和b的内存都无法读取。我明白这两个整数应该是未初始化的,但为什么他们的内存看起来不可读?
查看您的地址,问题似乎是缺少 malloc()
的原型。做:
#include <stdlib.h>
隐式 int
导致 malloc()
返回的值被截断(假设 64 位地址和 32 位整数)。因此,从而产生无效地址。
在 C99 之前的版本中,如果未找到函数的原型,编译器会隐式声明带有 int
的原型。但这自 C99 以来不再有效。
你应该 #include <stdlib.h>
其中包含 malloc
。 Visual Studio 没有给你任何警告吗?
当您不包含 <stdlib.h>
时,malloc
被赋予 int
的隐式 return 类型。这个 可能 在 sizeof(int) == sizeof(some_struct*)
的平台上工作,但如果它们的大小不同(例如 32 位整数和 64 位指针),值 returned by malloc
在赋值前被截断。
错误消息中的值 (0xFFFFFFFFAFBE4440
) 表明是这种情况:malloc
returned 了一个值为 0x????????AFBE4440
的指针,这是截断为 0xAFBE4440
,在分配时符号扩展为 0xFFFFFFFFAFBE4440
。
发生这种情况是因为您调用了函数 malloc 但忘记(或者您不知道)包含 stdlib.h.
这是工作代码:
#include <stdio.h>
#include<stdlib.h>
typedef struct{
int a;
int b;
} some_struct;
int main(void) {
printf("%lu", sizeof(some_struct));
some_struct * p_struct = malloc(sizeof(some_struct));
p_struct->a = 600;
p_struct->b = 100;
return 0;
}
你可能注意到我改变了:
printf("%i", sizeof(some_struct));
有:
printf("%lu", sizeof(some_struct));
因为如果您打开编译器设置,您将获得:
format ‘%i’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Werror=format=]|
注意: 在这里使用 %i 而不是 %d 没问题,但与 scanf 不同。