C语言多文件编程doit模块retrian函数及printf不生效问题求助
问题排查
- 1 野指针非法访问:doit.c中定义的
char *ptr没有分配任何可写内存,直接写入内容会触发段错误,是程序无法运行的核心原因。 - 2 缺少字符串结束符:字符串复制完成后没有给目标内存末尾添加
\0,后续用%s输出时会读到内存垃圾,出现乱码。 - 3 返回值缺失:
retrian函数声明为int返回类型,但实际没有写return语句,部分编译器会直接报错无法编译。 - 4 输入越界风险:main.c中没有限制输入长度,用户输入超过29个字符时会溢出
data数组的内存范围。
修正后代码
main.c
#include <stdio.h> int retrian(const char *message); int main() { char data[30]; int i = 0; char n; do { n = getchar(); data[i] = n; i++; } while (n != '\n' && i < 29); // 限制输入长度避免越界 data[i] = '\0'; retrian(data); return 0; }
doit.c
#include <stdio.h> #include <stdlib.h> int retrian(const char *message) { // 计算输入字符串长度 int len = 0; while(*(message + len) != '\0') len++; // 为目标指针分配对应大小的内存 char *ptr = (char*)malloc(len + 1); if (ptr == NULL) return -1; // 指针操作复制字符串 for(int k = 0; k < len; k++) { *(ptr + k) = *(message + k); } *(ptr + len) = '\0'; // 补字符串结束符 printf("%s is printing\n", ptr); free(ptr); // 释放内存避免泄漏 return 0; }
内容的提问来源于stack exchange,提问作者sungwon
相关产品推荐
相关产品推荐

