C 使用valgrind了解结果

C 使用valgrind了解结果,c,pointers,memory-leaks,valgrind,dynamic-memory-allocation,C,Pointers,Memory Leaks,Valgrind,Dynamic Memory Allocation,对于以下代码,我有以下定义: typedef struct string {char* data; int length;} string; 如果我用valgrind运行下面的代码,我得到的条件跳转或移动取决于单位化值和seg。故障: string* s = (string*) malloc(sizeof(string)); strcpy("Hello", s->data); free(s); 首先,我不明白为什么我会犯上述错误。 我想如果我添加到代码free(s-

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

typedef struct string {char* data; int length;} string;
如果我用valgrind运行下面的代码,我得到的条件跳转或移动取决于单位化值和seg。故障:

string* s = (string*) malloc(sizeof(string));
strcpy("Hello", s->data);
free(s);
首先,我不明白为什么我会犯上述错误。 我想如果我添加到代码
free(s->data)
中,它会释放内存,但程序运行正常

我是怎么想的: 我知道
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()

也就是说,它是strcpy(dest,source),所以在您的情况下

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

  • 从统一的内存位置读取
  • 写入字符串文字
其中任何一个调用

你应该写

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

确保
s->data
是有效的目标后。

“1(指针指向字符)”?现代PC上的典型指针大小为4或8。你的环境是什么?而且我猜分配应该是5字节,而不是5位。
strcpy(“Hello”,s->data)?你确定吗?@MikeCAT,你说得对。它是4位的。我有8位
首先,我不明白为什么会出现上述错误。。首先读取通过
malloc()分配的未初始化缓冲区
s->data
也未初始化。
s->data
仍未初始化。
string*s=(string*)malloc(sizeof(string))
是正确的,但随后添加:
s->data=maloc(sizeof(“hello”)
@PaulOgilvie当然是第一种方法,但是考虑到未知的用法,我们可能需要更多的内存——只是说说而已。