【问题标题】:segmentation fault while parsing a list of integers解析整数列表时出现分段错误
【发布时间】:2010-05-16 20:00:24
【问题描述】:
       int num_arrays;
       char *p[20];
       char tempc;       
       int i=0;
       do
       { p[i]=malloc(sizeof(int));
        scanf("%s",p[i]);
        tempc=*p[i];
        ++i;
        }while(tempc=='x');
        num_arrays=atoi(p[0]);

当我写num_arrays=atoi(..) 时,gcc 给我分段错误或内存 超出堆栈,我不明白为什么它会这样 谁能解释一下,为什么?

【问题讨论】:

  • 对不起,我忘了写“p[i]=malloc(sizeof(int));”我重写了我的问题,

标签: c segmentation-fault


【解决方案1】:

你还没有在p 中分配任何内存,所以它的元素指向随机位置。您可以像这样为最大长度为 100 的字符串分配内存:

int i;
for (i = 0; i < 20; i++)
  p[i] = malloc(101);

或者你想要一个字符的数组,而不是字符串,在这种情况下你应该声明它

char p[20];

在这种情况下,您不能尝试使用 scanf 将字符串读入每个元素。

更新缺失的代码部分添加后:

您正在为字符串分配 sizeof(int) 字节的内存,这很可能是 4 个字节,即 scanf 读取的输入字符串不得长于 3 个字符。否则会出现缓冲区溢出错误,这可能会导致您遇到的分段错误。

此外,tempc=p[i] 将指针值分配给字符变量!这个值,转换成一个字符,几乎肯定不会等于'x'

我猜你正在尝试获取p[i] 的第一个字符,即p[i][0]*p[i]

我还怀疑您的循环条件与您的想法相反:现在循环重复,只要 tempc 等于 'x' - 您可能想重复 直到 tempc 变为 'x'。您还应该检查您的循环是否运行不超过 20 次:

  ...
}while(tempc != 'x' && i < 20);

【讨论】:

  • //在写这个问题的时候,我忘记了,但在我的真实代码中,我已经分配了内存
  • @gcc,查看我的更新。我建议您在以后发布之前仔细检查您的代码:-)
【解决方案2】:

您没有为字符串分配内存。 (编辑:现在是)

您可能还想确保您的迭代次数不超过 20 次,因为您的 char* 数组只有 20 个元素。

同样假设 sizeof(int) == 4,您的字符串不能像现在一样大于 4 个字符,其中 1 个字符必须是空终止符。您可能希望为这些输入字符串分配更多空间。

【讨论】:

    猜你喜欢
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 2018-09-03
    • 2012-09-21
    • 1970-01-01
    • 2021-12-10
    • 2016-01-21
    相关资源
    最近更新 更多