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/