使用 valgrind 了解结果

Understanding results with valgrind

对于以下代码,我有以下定义:

typedef struct string {char* data; int length;} string;

如果我 运行 使用 valgrind 编写以下代码,我得到条件跳转或移动取决于未初始化的值和段。错误:

string* s = (string*) malloc(sizeof(string));
strcpy("Hello", s->data);
free(s);

首先,我不明白为什么会出现上述错误。 我想如果我添加到该代码 free(s->data) 它会释放内存但程序会 运行 ok.

我的看法: 我知道 sizeof(string) 等于 4(指向 char 的指针)+ 4(int)= 8。 然后我们为 s 分配 8 位。 strcpy 会将字符串复制到数据中,但我在这里遇到了问题。为什么?

存在多个问题:

string* s = (string*) malloc(sizeof(string));

哪个更好

string* s = malloc(sizeof(*s));

s->data 分配内存,但不会使 s->data 指向任何有效的内存位置。如果要使用内存位置,则需要确保它指向有效的内存位置。例如:您需要为 s->data 分别 malloc()

就是说,syntax for strcpy() 说的是 strcpy(dest, source),所以在你的情况下

strcpy("Hello", s->data);

尝试

  • 从未使用的内存位置读取
  • 写入字符串文字

其中任何一个调用 undefined behaviour.

你应该写

strcpy(s->data, "Hello");

确保 s->data 是一个有效目的地后。