C 不明白我为什么会出现分段错误
当我使用签名将数组传递到动态库中的函数中时:C 不明白我为什么会出现分段错误,c,segmentation-fault,dynamic-library,C,Segmentation Fault,Dynamic Library,当我使用签名将数组传递到动态库中的函数中时: void itoa(int n, char s[]); 从我的主函数调用它: int main(int argc, char *argv[]) { if (argc > 1) { char *arg = argv[1]; printf("%s\n", arg); } char str[15]={'0', '0', '0', '0', '0',
void itoa(int n, char s[]);
从我的主函数调用它:
int main(int argc, char *argv[])
{
if (argc > 1) {
char *arg = argv[1];
printf("%s\n", arg);
}
char str[15]={'0', '0', '0', '0', '0',
'0', '0', '0', '0', '0',
'0', '0', '0', '0', '\0'};
itoa(INT_MIN, str);
printf("%s\n", str);
return 1;
}
使用gdb浏览代码时,我可以看到程序在以下行中崩溃:
s[i++] = n % 10 + '0';
注意,i的初始值在函数顶部声明为0
为什么它会崩溃
更新 请注意,它在本地工作
#include <stdio.h>
#include <limits.h>
#include "c_lib.h"
void itoa_local(int n, char s[])
{
int min_int = 0;
int i, sign = 0;;
if (INT_MIN == n) {
min_int = 10;
n++;
}
if ((sign = n) < 0) n = -n;
do {
s[i++] = n % 10 + '0';
} while ((n /= 10) > 0);
if (sign < 0) s[i++] = '-';
s[i] = '\0';
if (min_int == 10) s[0]++;
reverse(s);
}
int main(int argc, char *argv[])
{
if (argc > 1) {
char *arg = argv[1];
printf("%s\n", arg);
}
char str[15]={'0', '0', '0', '0', '0',
'0', '0', '0', '0', '0',
'0', '0', '0', '0', '\0'};
itoa_local(INT_MIN, str);
printf("%s\n", str);
return 1;
}
#包括
#包括
#包括“c_lib.h”
无效itoa_本地(整数n,字符s[])
{
int min_int=0;
int i,符号=0;;
如果(INT_MIN==n){
min_int=10;
n++;
}
如果((符号=n)<0)n=-n;
做{
s[i++]=n%10+'0';
}而((n/=10)>0);
如果(符号<0)s[i++]='-';
s[i]='\0';
如果(min_int==10)s[0]++;
反面;
}
int main(int argc,char*argv[])
{
如果(argc>1){
char*arg=argv[1];
printf(“%s\n”,arg);
}
char str[15]={'0','0','0','0','0','0',',
'0', '0', '0', '0', '0',
'0', '0', '0', '0', '\0'};
伊藤忠县(国际民街);
printf(“%s\n”,str);
返回1;
}
答案在最初的帖子中。我回答了我自己的问题,所以我不必删除它。主要是存档原因。您的itoa\u local
函数没有初始化i
。哦,等等。Windows的libc中没有itoa
函数吗?可能是链接的,而不是预期的。您是对的,因为某些原因,我认为int I,a=0也会将I初始化为0。谢谢你的提醒。