无法访问 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 不同。