使用 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
是一个有效目的地后。
对于以下代码,我有以下定义:
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
是一个有效目的地后。