c - 使用结构传输变量

标签 c pointers struct segmentation-fault

我想使用结构传递几个变量。以下是示例程序代码。当我运行这个程序时,出现段错误。我使用 gcc 编译器。

谁能帮我解决这个问题?

struct data{
    const char * ip;
    const char * address;
    const char * name;
};

int fun(struct data *arg) {
    //struct data *all;
    const char *name = arg->name;
    printf("\n My name is:%s",name);
    return 1; 
}


int main(int argc, char * const argv[]) {
    struct data * all;   
    int k=0;
    //data.name = argv[1];

    all->name=argv[1];
    k = fun(all);

    printf("\n k is:%d ",k);

    return 0;
}

最佳答案

问题出在这里:

struct data * all;
all->name=argv[1];

您还没有为all 分配内存。当您有一个未初始化的指针时,它指向内存中的随机位置,您可能无法访问这些位置。您有两个选择:

  1. 在栈上分配:

    struct data all;
    all.name=argv[1];
    k = fun(&all);
    
  2. 在堆上分配:

    struct data *all = malloc(sizeof(*all));
    if (all != NULL)
    {
        all->name=argv[1];
        k = fun(all);
    }
    free(all);
    

当您知道 all 仅在当前函数(以及您调用的函数)中需要时,第一种情况很好。因此,在堆栈上分配它就足够了。

第二种情况适用于当您在创建它的函数之外需要 all 时,例如当您返回它时。想象一个函数初始化 all 并将它返回给其他人使用。在这种情况下,您不能在堆栈上分配它,因为它会在函数返回后被销毁。

您可以在 this question 中阅读更多相关信息.

关于c - 使用结构传输变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11538597/

相关文章:

无法理解程序头和节头中的偏移量成员

java - 将 java 变量数据映射到 C 结构并编写一个 c 兼容文件

c - 如何使用指针在声明后更改变量

c - 数组索引方法一个棘手的案例

c++ - 什么是空类的大小以及 C++ 中 union 、结构和类之间的区别?

c - 使用mmap从服务器接收文件

c++ - "no match for ' operator= '"in c++, 试图建立链表

c++ - 在指向父对象的指针上初始化子对象

C 结构体声明

类定义中结构数组的 C++ 问题