当前位置: 首页 > 知识库问答 >
问题:

c - 请教一下为什么会产生segmentation fault?

巫培
2023-09-03
#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct student{    int age;    char *name;} sst;typedef int Age;//typedef struct student sst;int main(){    int i,j;//    sst **c;    sst ** c = (sst **)calloc(3,sizeof(sst *));    for(i=0;i<3;i++){        c[i]=(sst *)calloc(4,sizeof(sst));    }    for( i=0;i<3;i++){        for( j=0;j<4;j++){            strcpy(c[i][j].name,"ffff");            c[i][j].age=i*j;        }    }    for(i=0;i<3;i++){        for(j=0;j<4;j++){            printf("%d\t%s\n",c[i][j].age,c[i][j].name);        }        free(c[i]);    }    free(c);    return 0;}

共有3个答案

赵嘉赐
2023-09-03

为啥总给自己挖坑呢.
要不就直接整成数组

typedef struct student{    int age;    char name[16];} sst;

要不如果不改名就直接指向.

typedef struct student{    int age;    const char *name;} sst;c[i][j].name = "ffff";

混着来那是要出错误的.

贲宜春
2023-09-03

你并没有为 c[i][j].name 分配空间

茅和玉
2023-09-03
嗯,此segmentfault并非彼segmentfault。

通常情况下,出现 "Segmentation fault"(段错误)的原因通常是由于程序访问了无效的内存。在你的代码中,可能的原因是对字符串指针 name 没有进行动态内存分配。
具体来说,在 sst 结构体中,你定义了一个指向字符的指针 name,但是没有为它分配内存。在使用 strcpy 函数将字符串复制到 name 指向的内存时,会导致段错误。

所以,给sst 结构体中的 name 字符指针分配内存。可以使用 malloc 或 calloc 函数来分配足够的内存。

#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct student {    int age;    char *name;} sst;int main() {    int i, j;    sst **c = (sst **)calloc(3, sizeof(sst *));    for (i = 0; i < 3; i++) {        c[i] = (sst *)calloc(4, sizeof(sst));        for (j = 0; j < 4; j++) {            c[i][j].name = (char *)malloc(sizeof(char) * 10);  // 假设每个名字最大长度为 10            strcpy(c[i][j].name, "ffff");            c[i][j].age = i * j;        }    }    for (i = 0; i < 3; i++) {        for (j = 0; j < 4; j++) {            printf("%d\t%s\n", c[i][j].age, c[i][j].name);            free(c[i][j].name);        }        free(c[i]);    }    free(c);    return 0;}

这样就解决了。

 类似资料:
  • 我不明白为什么< code>gcc -S -m32会产生这些特定的代码行: C 代码: 它给出以下输出:

  • 需求:实现将数组中所有元素调整为左右两部分,左边为奇数,右边为偶数。(c语言) 中这段代码: 能不能换成一下这个? 想问问为什么可换/为什么不能换? 谢谢指导,菜鸟万分感激。

  • 本文向大家介绍请介绍一下什么是生产者消费者模式?相关面试题,主要包含被问及请介绍一下什么是生产者消费者模式?时的应答技巧和注意事项,需要的朋友参考一下 生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据。 优点:支持并发、解耦。

  • 我观察到库函数,当它在循环中被调用一次时,它几乎总是产生正数。

  • 本文向大家介绍请你来说一下什么时候会发生段错误?相关面试题,主要包含被问及请你来说一下什么时候会发生段错误?时的应答技巧和注意事项,需要的朋友参考一下 段错误通常发生在访问非法内存地址的时候,具体来说分为以下几种情况: 使用野指针 试图修改字符串常量的内容

  • 当我评论tx:annotation-drive时,一切都很好,但是带有@transactional注释的method不起作用。我做错了什么? 我的年级依赖关系: