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当然是第一种方法,但是考虑到未知的用法,我们可能需要更多的内存——只是说说而已。