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

char指针访问异常:动态存储5个日期时间字符串仅能读取首个

问题分析与修复

你的代码存在几个关键问题,导致无法正确存储和访问5个字符串:

错误点详解

  1. 内存分配冗余
    你用了malloc(5 * 40 * sizeof(int)),但存储的是char类型数据,sizeof(int)会让你分配的内存是实际需要的4倍(假设int占4字节),完全多余。应该用sizeof(char),或者直接写5*40(因为char固定占1字节)。

  2. 字符串终止符导致打印截断
    C语言中printf("%s")会从起始地址开始打印,直到遇到\0终止符才停止。你的buf被sprintf写入后,末尾会自动添加\0,而你复制时把整个40字节的buf都拷贝到data中,第一个字符串的\0会出现在data的某个位置,导致后续字符串被截断无法打印。

  3. 访问后续字符串的方式错误
    你每次打印都直接用data,它始终指向第一个字符串的起始地址,自然看不到后面的内容。要访问第N个字符串,需要从data偏移N*40字节的位置开始。

  4. 缓冲区溢出风险
    sprintf不会检查缓冲区长度,如果格式化后的字符串超过buf的40字节,会导致内存溢出,触发未定义行为。应该用snprintf来限制写入长度。

修复后的代码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <string.h>

int main( int argc, char *argv[] )  
{
    int i = 0;
    const int STR_LEN = 40;
    const int COUNT = 5;
    
    int d = 43;
    // 分配刚好能存5个40字节字符串的内存,并检查分配是否成功
    char *data = malloc(COUNT * STR_LEN);
    if (!data) {
        perror("malloc failed");
        return 1;
    }
    char buf[STR_LEN];
    
    while (i < COUNT) {
        time_t t = time(NULL);
        struct tm tm = *localtime(&t);
        
        // 用snprintf限制写入长度,避免缓冲区溢出
        snprintf(buf, STR_LEN, "%d-%02d-%02d %02d:%02d:%02d %d: %.2f\n", 
                 tm.tm_mon + 1, tm.tm_mday, tm.tm_year + 1900, 
                 tm.tm_hour, tm.tm_min, tm.tm_sec, d, d/58.0);
        
        // 将当前buf的内容复制到data的对应位置
        memcpy(data + i*STR_LEN, buf, STR_LEN);
        
        // 打印当前存储的字符串(可选)
        printf("第%d条记录:%s", i+1, data + i*STR_LEN);
        
        i++;
        sleep(1);
    }
    
    // 循环打印所有存储的字符串
    printf("\n===== 所有存储的记录 =====\n");
    for (i = 0; i < COUNT; i++) {
        printf("%s", data + i*STR_LEN);
    }
    
    // 记得释放动态分配的内存
    free(data);
    printf("Finished\n");
    return 0;
}

关键修改说明

  • 用snprintf替代sprintf,确保不会超出buf的长度,避免溢出。
  • 内存分配改为COUNT * STR_LEN,精准匹配需求,同时添加了malloc失败的检查。
  • 用memcpy直接将buf复制到data的偏移位置,每个字符串占据独立的40字节空间。
  • 访问第i个字符串时,使用data + i*STR_LEN作为起始地址,确保能正确指向对应字符串。
  • 添加了内存释放操作,避免内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 09:05:24