gpt4 book ai didi

c - 如何纠正 char * 到 int 转换的段错误

转载 作者:行者123 更新时间:2023-11-30 21:23:01 25 4
gpt4 key购买 nike

我编写了以下程序,以便将以整数序列作为其地址的指针转换为整数:

#include <math.h>
#include <stdio.h>

char *recepcao() { char *receber;
scanf("%s", receber);
return receber;
}
int conversao(char *string) { int i, j;
for(i=0; string[i]!='\0'; ++i) {
continue;
}
int *var;
int contagem=0;
for(j=0; j<i-1; ++j) {
var[j]=(string[j]-'0');
contagem+=var[j]*pow(10, (i-j-1));
}

return contagem;
}
int main() {
printf("%i", conversao(recepcao())); return 0;
}

我已经尝试了大约一千次来纠正所有循环,但在收到 scanf 值后,程序仍然会崩溃,如某些 IDE 上所述,并且会在其他 IDE 上显示“段错误:11”消息。我怎样才能解决这个问题?该消息的正确定义是什么?

最佳答案

receber 是一个未初始化的指针。 scanf 需要一个 char* 来记录读取的字符。但就你而言,它指向一些你不应该访问的内存。尝试访问它是未定义的行为。在您的情况下,它会导致段错误。

许多解决方案包括使用 char receber[MAXLEN+1]char * receber = malloc(MAXLEN+1)。现在这里有一个案例。第一个解决方案将产生一个具有自动存储持续时间的数组 - 长话短说,当函数结束时它将指向一些无效的内存 - 所以你不能返回它(如果您使用第一个解决方案)。

第二种解决方案将动态分配内存,这将导致存储持续时间超出此函数的范围。 这将是在本例中使用的正确选项。

对于其他函数中的 var,您可以使用动态内存分配或 VLA 支持(如果有的话)。您应该分配大小等于字符串长度的内存。这里它不会停止在分配上 - 您需要用值初始化它,以便您可以像您一样在算术运算中使用它。 (再次使用未初始化的行为是未定义的行为)

为了供您引用,有一个名为 strlen 的函数,它可以为您提供字符串的长度(以 nul 结尾的字符数组) - 在这里使用它。

此外,如果您检查引用手册或手册页,您将看到 pow 返回 double - 所以在这里以防您遇到一些精度问题。为了计算积分幂,请使用自定义函数 - 最好在精度的情况下并避免令人讨厌的精度误差。

关于c - 如何纠正 char * 到 int 转换的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48977054/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com