如何将随机字符串存入字符指针数组?现有C代码输出异常求改进
问题分析与解决方案
你的代码核心问题有三个:
- 栈内存悬空指针:
temp是fn函数里的栈局部变量,当fn执行完毕返回main后,这块栈内存会被系统回收,arr数组里的所有指针都变成了悬空指针,访问它们属于未定义行为。 - 重复指向同一地址:每次循环都把同一个
temp的地址赋值给*p,导致arr的所有元素最终都指向同一个内存地址,之后你又调用empty_arr清空了temp,所以最后所有指针指向的内存都是全空的。 - 缺少字符串终止符:你生成的字符序列没有添加
'\0',就算没清空,也不是合法的C字符串,后续操作(比如打印)会出问题。
改进方法:使用堆内存存储每个字符串
给每个字符串单独分配堆内存(malloc),这样内存不会随着fn函数结束而释放,每个数组元素指向独立的内存块,同时记得添加字符串终止符。
修改后的完整代码:
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h> void fn(char **); int main() { char *arr[10]; fn(arr); printf("here!\n"); // 打印所有生成的字符串 for (int i = 0; i < 10; i++) { printf("arr[%d]: %s\n", i, arr[i]); } // 释放堆内存,避免泄漏 for (int i = 0; i < 10; i++) { free(arr[i]); } return 0; } void fn(char **a) { char **p = a; srand(time(NULL)); for (int i = 0; i < 10; i++) { // 分配内存:3个字符 + 1个终止符'\0' *p = malloc(4 * sizeof(char)); if (*p == NULL) { perror("malloc failed"); exit(EXIT_FAILURE); } char *t = *p; for (int j = 0; j < 3; j++) { int random = 32 + (rand() % 30); *t = (char)random; t++; } *t = '\0'; // 添加字符串终止符,确保是合法C字符串 p++; // 移动指针到下一个数组元素 } }
关键改动说明:
- 去掉了
empty_arr函数,不再需要清空栈内存,而是直接在堆内存上生成字符串。 - 每次循环用
malloc分配4字节内存(3个字符+终止符),分配失败时做错误处理。 - 生成完3个字符后,手动添加
'\0',保证字符串合法。 - 在
main函数中添加了内存释放逻辑,避免内存泄漏。
内容的提问来源于stack exchange,提问作者user18310766
相关产品推荐
相关产品推荐

