C语言整数转字符串函数出现段错误,printf无输出求排查
哥们,你这段代码的问题其实挺明显的,我帮你拆解下为啥会触发段错误还没输出:
问题拆解
- 指针未分配内存:你声明了
char *string;但完全没给它分配内存空间,直接往string[i++]写数据相当于访问随机的非法内存地址,操作系统必然会触发段错误(Segmentation Fault),因为它不允许你读写不属于你的内存。 - 循环条件逻辑错误:
while(x >= 0)这个条件会导致两种问题:如果输入正数,最后x会变成0,x /=10后还是0,循环会无限执行下去;如果输入负数,第一次循环后x会变成负数,循环直接终止,既没处理负号,还会出现numericalChar[负数]的非法内存访问。 - 字符串缺少终止符:就算前面的问题都解决了,你输出的
string没有加字符串结束符'\0',printf("%s")会一直读取内存直到找到'\0',要么输出乱码,要么直接无输出。 - 字符顺序反转:你是先存数字的个位,最后得到的字符串是逆序的(比如输入123会存成'3'、'2'、'1'),输出结果完全不符合预期。
修复后的代码示例
#include <stdio.h> #include <stdlib.h> #include <limits.h> void to_string(int x) { // 处理特殊情况:输入为0 if (x == 0) { printf("0\n"); return; } int is_negative = 0; unsigned int num; // 处理负数,避免INT_MIN取反溢出 if (x < 0) { is_negative = 1; num = (unsigned int)-x; } else { num = (unsigned int)x; } // 先计算数字的位数,确定需要的内存大小 unsigned int temp = num; int digits = 0; while (temp > 0) { digits++; temp /= 10; } // 分配内存:位数 + 负号(如果需要) + 字符串终止符 char *string = (char*)malloc(digits + is_negative + 1); if (string == NULL) { perror("内存分配失败"); return; } int i = digits + is_negative - 1; // 从低位到高位填充字符,最后得到正序字符串 while (num > 0) { int value = num % 10; string[i--] = "0123456789"[value]; num /= 10; } // 添加负号(如果是负数) if (is_negative) { string[0] = '-'; } // 加上字符串终止符 string[digits + is_negative] = '\0'; printf("%s\n", string); // 释放动态分配的内存,避免内存泄漏 free(string); } // 测试用例 int main() { to_string(123); to_string(-456); to_string(0); to_string(INT_MIN); // 测试最小整数,避免溢出问题 return 0; }
额外说明
- 专门处理了
INT_MIN的情况:直接对最小整数取反会溢出,所以用unsigned int来转换存储,避免这个问题。 - 动态分配内存后一定要检查是否成功,
malloc可能因内存不足返回NULL。 - 用完动态内存记得调用
free,不然会造成内存泄漏。
内容的提问来源于stack exchange,提问作者TheCaptain




