c - 将 int 分配给数组元素时出现段错误

标签 c arrays string pointers segmentation-fault

我的程序的这一部分旨在迭代 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/

相关文章:

c - 如何声明一个返回数组指针的函数?

c - 为什么会出现错误 "Segmentation fault 11"以及如何在 C 中修复它?

arrays - 如何用元胞数组中的 "string"类型替换所有 "char"类型?

Java 字符串 - 1 不是 1?

c - PIL 逊系数计算数组

c - 使用C的礼物程序

Java 8 将 int[][] 转换为 Integer[][] 的方法

c - 如何在二维数组中成对存储随机字母?

C# 使用 .txt 处理数组

python - python函数中的反向文本