【问题标题】:Weird characters when allocating memory for char*为 char* 分配内存时出现奇怪的字符
【发布时间】:2016-11-25 18:30:29
【问题描述】:

我有一个示例代码,它应该以 LCD 显示器(运行文本)的方式写入“MSG”,当它到达末尾时它会再次开始,但是当我为“LCD”分配内存时(应该是 10 个字符+终止 0) 用一堆随机字符填充它。 Sample picture

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h> 
#include <time.h>



void delay(unsigned int mseconds)
{
    clock_t goal = mseconds + clock();
    while (goal > clock());
}

int main()
{

    int LCDSize = 10;
    int MSGSize;
    char* LCD = (char *)malloc(LCDSize+1);
    char* MSG = (char *)malloc(80);
    MSG = "This is a long message, probabli will move.";
    MSGSize = strlen(MSG);
    if (MSGSize <= LCDSize)
    {
        printf(MSG);
    }
    else
    {
        char* tmpMSG;
        int j = 0;
        while (j < 2)
        {
            for (int i = 0; i < MSGSize - LCDSize + 1; i++)
            {
                tmpMSG = MSG+i;
                strncpy(LCD, tmpMSG, LCDSize);
                strcat(LCD,"\0");
                printf(LCD);
                delay(200);
                system("cls");

            }
            printf("----------");
            j++;
        }
    }

    getchar();
    return 0;
}

可能是什么问题?

【问题讨论】:

  • 使用printf(MSG); 不是一个好主意;你应该使用printf("%s", MSG);。这里不是很重要,因为用户无法控制消息的内容并且消息不包含百分号(如果一切正常的话),但通常对于用户提供的要打印的数据,您使用的内容可能是致命的。它们被称为“格式字符串漏洞”。

标签: c char malloc


【解决方案1】:
            strncpy(LCD, tmpMSG, LCDSize);
            strcat(LCD,"\0");

如果不适合,strncpy 函数将不会终止。在这种情况下,它不适合。所以没有终止。不以零字节结尾的东西不是合法字符串,所以你不能将指向它的指针作为第一个参数传递给strcat,但你可以。

strcat 函数将一个字符串附加到另一个字符串上。两个字符串都必须是合法的、格式正确的字符串,否则您不能调用strcat

这是通常建议您不要使用strncpy的原因之一——不能保证结果是有效的字符串,而且很容易犯你犯的那种错误.是的,您通过限制大小确保调用strncpy 时没有溢出缓冲区,但您没有确保缓冲区包含有效字符串。

您可能想要的是LCD[LCDSize]='\0';,而不是调用strcat。这确保缓冲区被终止。

【讨论】:

  • 从技术上讲,任何缓冲区最终都会以零字节终止,因此任何缓冲区实际上都是合法字符串:)
  • @m0skit0:不。如果分配给缓冲区的空间内没有空字节,则缓冲区不是合法字符串。最终,在缓冲区范围之外的某个地方会有一个零字节,这可能会被视为字符串的终止,但在此之前很久就会发生“未定义的行为”——任何事情都可能发生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-01
  • 1970-01-01
  • 2020-11-28
  • 2019-03-25
  • 2021-05-19
  • 2014-07-18
相关资源
最近更新 更多