【问题标题】:buffer overflow during memory reallocation内存重新分配期间的缓冲区溢出
【发布时间】:2017-05-29 07:51:04
【问题描述】:

我正在制作一个 C 程序,将 12 小时制时钟转换为 24 小时制时钟,输入格式为 HH:MM:SSAM 或 HH:MM:SSPM,24 小时制时钟输出为 HH:MM:SS

#include <stdio.h>
#include <stdlib.h>

int main(){
    char *time = malloc(11 * sizeof(char));
    scanf("%11s", time);
    if (time[8] == 'A' || time[8] == 'P')
    {

        if (time[8] == 'A')
        {
            time = realloc(time, (9 * sizeof(char)));                
            printf("%s\n", time);
        }
        else
        {
            time = realloc(time, (8 * sizeof(char)));                
            char str[3];
            sprintf(str, "%c%c", time[0], time[1]);
            int hours;
            hours = atoi(str);
            int milhours;
            milhours = hours + 12;
            char milstr[3];
            sprintf(milstr, "%d", milhours);
            time[0] = milstr[0];
            time[1] = milstr[1];
            printf("%s\n", time);
        }   
    }
    else
    {
        printf("give a standard format\n");
        return 0;
    }
    return 0;
}

没有编译错误,但是由于缓冲区溢出,程序没有运行。当我减小 dnamic 数组 time 的大小时,是否有必要删除 time 的最后两个元素?

编辑:我为NULL 终止符更新了timestrmilstr,缓冲区溢出问题得到解决。感谢您的推荐阅读!

【问题讨论】:

  • 为什么要在 realloc 之后调用free(time)
  • 为 NUL 终止符分配 +1。
  • sizeof(char) 根据定义等于 1。
  • time是常用的标识符,最好自己用。
  • 在给出 cmets 和/或问题后就地编辑您的问题不是一个好主意,因为此类编辑可能会使答案/评论难以理解。最好将编辑添加为您的问题的更新/添加。

标签: c dynamic-arrays realloc buffer-overflow


【解决方案1】:

编辑:我更新了 NULL 终止符的时间、str 和 milstr,缓冲区溢出问题得到了解决。感谢您的推荐阅读!

你还是有问题。

char *time = malloc(11 * sizeof(char));
scanf("%11s", time);

malloc 分配 11 个字节,但 scanf 需要 12。那是因为 C 字符串以空字节结束,你总是需要再分配一个字节。


至于你正在做的所有重新分配,看起来你这样做是为了截断字符串。这对于 3 个字节来说太过分了,而且它也不会被截断。因为realloc 可能返回相同的指针,所以你不能指望收缩会将后面的内存归零并截断字符串。当它返回一个不同的指针,或者当它增加内存时,你不能指望它。只有calloc才能确定分配的内存已经清零了。

相反,跳过realloc 并插入一个空字节以截断字符串。

if (time[8] == 'A')
{
    time[8] = '\0';
    puts(time);
}

time 仍然是 12 个字节(一旦 malloc 被修复),但空字节告诉 C 在 time[8] 处停止读取。

【讨论】:

  • 感谢您的回答!我可能同时发现了这些问题,并且我修复了这些问题,我的主要问题是缓冲区溢出,不过我通过 cmets 得到了一个想法:)
猜你喜欢
  • 2020-06-09
  • 1970-01-01
  • 2010-11-11
  • 2017-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-16
相关资源
最近更新 更多