我的程序的这一部分旨在迭代 char
字符串的 s,然后选择字符串中的所有数字并将它们放入名为 helper
的数组中。这是我正在开发的一个较大程序的一小部分,我已尽力只提供有用的代码段。我也知道由于没有正确使用指针而导致段错误,但是我的问题是我找不到在哪里错误地使用了指针。
所以,当我尝试编译以下代码时,我遇到了段错误(核心转储)...
#include <stdio.h>
#include <string.h>
int main(void)
{
char *eq = "y=344+99";
int helper[50];
unsigned short int helperWriter = 0, i;
for (i = 0; i < eq[i]; i++) //
{
if (isdigit(eq[i]))
{
unsigned short int d;
for (d = i; eq[d]; d++)
{
if (isdigit(eq[d]))
{
int temp = atoi(eq[d]);
helper[helperWriter] = temp;
printf("%d", helperWriter);
}
helperWriter++;
}
}
}
}
我对 C 相当陌生,反过来,对指针也很陌生,所以我的错误可能非常愚蠢。如果需要任何额外信息,请询问。
最佳答案
当您使用库函数而不包含其原型(prototype)时,编译器会假设其参数和返回类型为 int
。你没有#include <stdlib.h>
(或 ctype.h
就此而言)所以在这一行
int temp = atoi(eq[d]);
您正在传递 char
编译器很乐意将其提升为 int
。但是atoi
需要 char*
类型。因此它尝试访问机器中低地址的内存,从而导致段错误。该行应该是
int temp = atoi(eq + d); // or `atoi(&eq[d])`
将每个字符串字符的地址传递给 atoi
.
第一个循环不正确,您应该测试 nul
终结者。
您还遇到 helperWriter++;
错误位于错误的位置:将其移至您放置的位置 temp
的正下方进入数组。
您也忽略了我的建议,即放置 newline
在每条调试消息的末尾(以确保在崩溃发生之前实际看到它)。
您在选择号码然后跳过它的过程中可能还存在其他错误。您不需要两个嵌套循环,atoi
会将数字转换为下一个非数字字符。
关于c - 将 int 分配给数组元素时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36247861/