为char *分配内存时的奇怪字符

时间:2016-11-25 18:30:29

标签: c char malloc

Hy我有一个示例代码,它应该写出" MSG"在某种程度上,液晶显示器会(运行文本),当它到达终点时,它会再次发生故障,但是当我为液晶显示器分配内存时(其中应该是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;
}

可能是什么问题?

1 个答案:

答案 0 :(得分:3)

            strncpy(LCD, tmpMSG, LCDSize);
            strcat(LCD,"\0");

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

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

这是一般建议您使用strncpy的原因之一 - 无法保证结果是有效的字符串,并且很容易犯这种错误你做了是的,当您通过限制大小调用strncpy时,确保没有溢出缓冲区,但是您没有确保缓冲区包含有效字符串。

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