Malloc 结构中的字符串
Posted
技术标签:
【中文标题】Malloc 结构中的字符串【英文标题】:Malloc a String in the Struct 【发布时间】:2021-01-13 06:35:36 【问题描述】:结构看起来像这样。
struct Tree
int operation;
struct Tree *left;
struct Tree *right;
char *value;
;
接下来,我尝试用这个函数创建一棵树:
struct Tree *new_node(int operation_new, struct Tree *left_new, struct Tree *right_new, char new_value[MAX_LENG])
struct Tree *n;
n = (struct Tree *)malloc (sizeof(struct Tree));
if (n == NULL)
printf("Unable to Malloc New Structure Tree");
exit(1);
n->operation = operation_new;
n->left = left_new;
n->right = right_new;
// n->value = (char *)malloc(sizeof(strlen(new_value) + 1)); // -------- ( 1 )
n->value = new_value;
return n;
所以,我创建了一棵树并将其打印出来。因此,在打印树时,操作,即整数被正确打印。但是 value 没有正确打印。也就是说,只有在树的末尾输入的值 (node
) 会到处打印。值为 字符串 (char *
)。所以我用谷歌搜索了这个问题。我找到了这个答案。
Malloc char* 将其存储在 struct
所以我尝试了不同的方法来 malloc 。下面是一些例子。
// This gave me a Segmentation Fault
n->value = (char *)malloc(sizeof(strlen(new_value) + 1));
strcpy(n->value, new_value);
// This gave me a Segmentation Fault
n->value = malloc(sizeof(strlen(new_value) + 1));
strcpy(n->value, new_value);
这些都没有给出准确的结果!您能告诉我如何正确malloc 结构中的字符串吗?
【问题讨论】:
N->value=strdup(new_value) 并解释一下:sizeof
给出了变量或值的存储大小。你给它的返回值是strlen
,通常是 4 或 8 个字节。所以它将返回 4 或 8,你将分配 5 或 9 个字节。只需如前所述直接使用strlen
,或使用其他提到的方式strdup
,用于创建C 字符串的副本,包括分配内存。
@user3121023 抱歉:/您的代码出现分段错误
@pm100 也很抱歉:/ 你的代码给出了分段错误
【参考方案1】:
要分配字符串的副本,请使用strlen(new_value) + 1
作为传递给malloc
的大小,传递sizeof(strlen(new_value) + 1)
是不正确的,计算结果为sizeof(size_t)
,它是常量(通常为4 或8,具体取决于平台)。代码是:
n->value = malloc(strlen(new_value) + 1);
if (n->value != NULL)
strcpy(n->value, new_value);
注意这种在单个调用中分配字符串副本的更简单方法:
n->value = strdup(new_value);
【讨论】:
虽然strdup()
通常可用,但它不是(还)标准 C,而是 POSIX 扩展。仅当您使用排除标准 C 中不包含的函数声明的编译器选项(例如 GCC 的 -std=c11
选项)时,区别才有意义。用-std=gnu11
代替是最简单的;如果失败,请在包含第一个系统标头之前激活 POSIX #define _XOPEN_C_SOURCE 700
。
谢谢。我试过这个。但是该代码给出了分段错误:(
对不起 :) 你的回答是正确的。我在我的代码中忘记了一些东西。非常感谢!以上是关于Malloc 结构中的字符串的主要内容,如果未能解决你的问题,请参考以下文章
当 malloc()-ing 相同的结构时,如何在结构中使用 C++ 字符串?
char 指向字符串的指针,然后进入字符串数组。 *** `./a.out' 中的错误:malloc():内存损坏:0x0900c3b0 ***