除非复制,否则为什么指向malloc'd区域的指针会失败?

时间:2010-07-14 12:23:17

标签: c malloc

我有一个指向结构的指针。我调用一个例程来确定我是否需要这个结构并使用malloc为它分配空间,返回指向该区域的指针,如果未使用则返回零。

struct node *node_p;
node_p = need_this();

这有效,我可以正确访问结构的所有元素。 struct node的一个元素是* next,它指向下一个节点struct和一个指向字符串的指针,但是它返回一个指向一个字符串的指针,该字符串在这个例程中甚至不存在。

node_p=find_string(node_p->next,"string");

但是,这会将结构中的指针返回到正确的字符串。

struct node *node_p, *node_copy;
node_copy=find_string(node_p->next,"string");

唯一的区别是使用第二个指针而不是原始指针。我在这里做错了什么或者必须更深入到被调用的函数中?归咎于被调用函数的问题是我在多个地方使用它几个月而没有问题,但是其他调用只查找字符串而不会转到'next'。

编辑:进一步的调试表明问题实际上在于指针被传递给find_string而不是返回的指针。这改变了问题和问题所以我需要打开另一个问题。

2 个答案:

答案 0 :(得分:2)

在此片段中:

struct node *node_p, *node_copy;
node_copy=find_string(node_p->next,"string");

在尚未初始化时取消引用node_p(不指向合法分配的内存块)。这是未定义的行为。您应该首先将node_p设置为合法分配的合适大小的内存块。

答案 1 :(得分:0)

您需要为每个结构显式分配内存,即分配一个新结构并设置指向它的下一个指针。 初始化之前C中的指针指向随机位置,您永远不应该取消引用它们。安全策略是将它们初始化为NULL。