在函数中指定结构的char**成员

在函数中指定结构的char**成员,c,C,我有一个包含char**的结构,我需要在函数中分配其成员,但以下分配不起作用: #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct { char **clist; } rule; void assign(rule *rule) { char buf[128] = "hello"; rule->clist[0] = buf; } in

我有一个包含char**的结构,我需要在函数中分配其成员,但以下分配不起作用:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct {
    char **clist;
} rule;

void assign(rule *rule) {
    char buf[128] = "hello";
    rule->clist[0] = buf;
}

int main()
{
    rule rule;
    rule.clist = malloc(sizeof(char*) * 8);

    assign(&rule);
    printf("%s\n", rule.clist[0]);

    return 0;
}

char buf[128]
是在赋值函数的上下文中分配的堆栈。它不能以这种方式传递,因为在函数返回后,内存就消失了。您需要使用
char*buf然后执行
buf=malloc(128)取而代之

char buf[128]
是在赋值函数的上下文中分配的堆栈。它不能以这种方式传递,因为在函数返回后,内存就消失了。您需要使用
char*buf然后执行
buf=malloc(128)取而代之

在赋值函数中使用的Buf字符串是赋值函数的局部变量。这意味着退出赋值函数的作用域后,您将无法访问此内存(它将成为垃圾)

要修复它,可以使用两种方法:

  • 在数据段(即创建为静态/全局变量)或堆(使用malloc)中创建buf字符串

  • 使用strcpy将buf中的数据复制到
    rule.clist[0]

  • 这应该起作用:

    void assign(rule *rule) {
        char buf[128] = "hello";
        rule->clist[0] = (char*)malloc(sizeof(char)*(strlen(buf)+1));
        strcpy(clist[0],buf);
    }
    
    int main()
    {
        rule rule;
        rule.clist = malloc(sizeof(char*) * 8);
    
        assign(&rule);
        printf("%s\n", rule.clist[0]);
    
        return 0;
    }
    

    在赋值函数中使用的Buf字符串是赋值函数的局部变量。这意味着退出赋值函数的作用域后,您将无法访问此内存(它将成为垃圾)

    要修复它,可以使用两种方法:

  • 在数据段(即创建为静态/全局变量)或堆(使用malloc)中创建buf字符串

  • 使用strcpy将buf中的数据复制到
    rule.clist[0]

  • 这应该起作用:

    void assign(rule *rule) {
        char buf[128] = "hello";
        rule->clist[0] = (char*)malloc(sizeof(char)*(strlen(buf)+1));
        strcpy(clist[0],buf);
    }
    
    int main()
    {
        rule rule;
        rule.clist = malloc(sizeof(char*) * 8);
    
        assign(&rule);
        printf("%s\n", rule.clist[0]);
    
        return 0;
    }
    

    assign
    函数中,变量
    buf
    是一个局部变量,其生存期将随着函数的结束而结束,给您留下一个无效指针。关于堆栈溢出,这里有很多重复的内容。请阅读C语言书中关于C字符串的章节。这将是早期的。也不要使用诸如“它工作”和“它不工作”之类的问题描述;如果
    buf
    在主程序中被声明为一个变量,那么如果您想在
    assign
    中使用该变量,需要做什么呢?请您自己帮个忙,在C编译器中启用所有警告(如果可能,甚至使其出错)。例如,如果您使用的是gcc,请将
    -Wall-Werror
    添加到
    assign
    函数中的编译器命令行中,变量
    buf
    是一个局部变量,其生存期将随着函数的结束而结束,留下一个无效指针。关于堆栈溢出,这里有很多重复的内容。请阅读C语言书中关于C字符串的章节。这将是早期的。也不要使用诸如“它工作”和“它不工作”之类的问题描述;如果
    buf
    在主程序中被声明为一个变量,那么如果您想在
    assign
    中使用该变量,需要做什么呢?请您自己帮个忙,在C编译器中启用所有警告(如果可能,甚至使其出错)。例如,如果您使用的是gcc,那么将
    -Wall-Werror
    添加到编译器命令行
    规则->clist[0]=(char*)malloc(sizeof(char)*(strlen(buf)+1));strcpy(clist[0],buf)应该是
    规则->clist[0]=strdup(buf)它给出了相同的结果,所以是的,你是对的
    规则->clist[0]=(char*)malloc(sizeof(char)*(strlen(buf)+1));strcpy(clist[0],buf)应该是
    规则->clist[0]=strdup(buf)它给出相同的结果,所以是的,你是对的