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);

这些都没有给出准确的结果!您能告诉我如何正确ma​​lloc 结构中的字符串吗?

【问题讨论】:

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 溢出

当 malloc()-ing 相同的结构时,如何在结构中使用 C++ 字符串?

malloc sizeof 结构的各个成员?

结构体指针malloc

将带有数字和字母的字符串放入结构中的int指针中

char 指向字符串的指针,然后进入字符串数组。 *** `./a.out' 中的错误:malloc():内存损坏:0x0900c3b0 ***