You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将随机字符串存入字符指针数组?现有C代码输出异常求改进

问题分析与解决方案

你的代码核心问题有三个:

  1. 栈内存悬空指针:temp是fn函数里的栈局部变量,当fn执行完毕返回main后,这块栈内存会被系统回收,arr数组里的所有指针都变成了悬空指针,访问它们属于未定义行为。
  2. 重复指向同一地址:每次循环都把同一个temp的地址赋值给*p,导致arr的所有元素最终都指向同一个内存地址,之后你又调用empty_arr清空了temp,所以最后所有指针指向的内存都是全空的。
  3. 缺少字符串终止符:你生成的字符序列没有添加'\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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 03:43:09