c-这两者有什么区别



我有这个函数,它应该复制链接列表中的节点(而不是第一个(

struct Node {
char* data;
Node* next;
};
void Insert(Node*head, int index, char* data) {//find a is function to find needed position
Node* temp = find(head, index);
Node* t = (Node*)malloc(sizeof(Node));
t->data = (char*)malloc(100);//where the problem is //line 4
strcpy(t->data, data);
t->next = temp->next;
temp->next = t;
}

如果第4行在我的代码中,它会很好地工作。我读过这个问题:

当数据被复制扫描读取到未初始化的时发生崩溃或分段故障

所以我知道指针不能包含任何数据,并且我不能将数据复制/存储到指针中。所以,正如你所看到的,我先为它分配了内存,然后把数据放进去,否则我的程序就会崩溃。

但后来我使用了这个:t->data = data;,它起作用了,所以我想知道:为什么当我像这个strcpy(t->data, data);一样使用strcpy时,我需要先为t->data分配内存,否则我的程序会崩溃;但是这个t->data = data;可以很好地工作,而不需要分配内存?

你能向我解释一下吗?

PS:铸造malloc是因为使用了c++编译器。

当您使用代码t->data = data时,您不会将任何数据复制到您的节点!您所要做的就是使节点的data成员指向函数参数也指向的数据,因此,如果您稍后更改该数据,那么您也将更改节点的数据。这可能不是你想要的!例如,如果您从"外部"多次调用该函数,并使用相同的变量传入数据,则添加的每个节点都将有一个指向相同数据的data成员。

如果您确实想将参数中的数据复制到新节点(就像对strcpy的调用一样(,则必须首先为其分配存储空间,使用(在代码中(malloc函数。

但是,正如评论中所提到的,strdup函数在这里要方便得多:这两个函数都可以分配(确切所需的(内存,并且可以一下子复制数据:

t->data = strdup(data);

注意:strdup分配的内存需要在使用完后释放(通过调用free(,其方式与malloc分配的内存相同。

只有当需要引用对象的大小时,才为指针的大小分配代码。

// Node* t = (Node*)malloc(sizeof(Node*));
Node* t = (Node*)malloc(sizeof(Node));

更好的方法是根据引用的对象而不是类型来调整大小。也不需要铸造。

Node* t = malloc(sizeof *t);

字符串分配也很可疑。我期望的不是固定的100,而是字符串大小的分配。

//t->data = (char*)malloc(100);
//strcpy(t->data, data);
size_t len = string(data);
t->data = malloc(len + 1);
strcpy(t->data, data);

鲁棒代码将检查分配错误。

Node* t = malloc(sizeof *t);
if (t == NULL) Handle_OutOfMemory();

相关内容

  • 没有找到相关文章