c - 解析整数列表时出现段错误

标签 c segmentation-fault

       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 中分配任何内存, 所以它的元素指向随机位置。您可以像这样为最大长度为 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);

关于c - 解析整数列表时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2845247/

相关文章:

C 程序没有打印我所期望的

c - 如何将一个 5 字节的十六进制数转换为 10 进制数并用 C 类型字符串表示?

python - 从 Python 和环境变量调用 OpenMP C 库

c - 排序函数的意外行为

c - 访问返回指针时出现段错误

c - 二叉树Find_parent方法导致SegFault

c - 代码片段段错误的起源

c - getc 返回值存储在一个 char 变量中

c++ - 对于非常多的点,找出三角形上或三角形内的点数?

c - macOS 上的段错误,但 Ubuntu 上没有