You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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;
}

额外说明
  1. 专门处理了INT_MIN的情况:直接对最小整数取反会溢出,所以用unsigned int来转换存储,避免这个问题。
  2. 动态分配内存后一定要检查是否成功,malloc可能因内存不足返回NULL。
  3. 用完动态内存记得调用free,不然会造成内存泄漏。

内容的提问来源于stack exchange,提问作者TheCaptain

火山引擎 最新活动