C 为字符分配内存时出现奇怪的字符*

C 为字符分配内存时出现奇怪的字符*,c,char,malloc,C,Char,Malloc,为什么我有一个示例代码bleow,它应该以LCD显示器(运行文本)的方式写入“MSG”,当它到达末尾时,它会再次启动,但当我为“LCD”分配内存时(应该是10个字符+终止0),它会填充一堆随机字符。 #包括“stdafx.h” #包括 #包括 #包括 #包括 无效延迟(无符号整数毫秒) { 时钟目标=毫秒+时钟(); while(目标>时钟()); } int main() { int-LCDSize=10; int-MSGSize; char*LCD=(char*)malloc(LCDSiz

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

#包括“stdafx.h”
#包括
#包括
#包括
#包括
无效延迟(无符号整数毫秒)
{
时钟目标=毫秒+时钟();
while(目标>时钟());
}
int main()
{
int-LCDSize=10;
int-MSGSize;
char*LCD=(char*)malloc(LCDSize+1);
char*MSG=(char*)malloc(80);
MSG=“这是一条很长的消息,可能我会移动。”;
MSGSize=strlen(MSG);
如果(MSGSize
strncpy
函数如果不适合就不会终止。在这种情况下,它不适合。因此没有终止。未以零字节结尾的内容不是合法字符串,因此您不能将指向它的指针作为第一个参数传递给
strcat
,但您可以这样做

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

这是通常建议您不要使用
strncpy
的原因之一——无法保证结果是有效字符串,并且很容易犯类似的错误。是的,您通过限制大小确保在调用
strncpy
时没有溢出缓冲区,但没有确保缓冲区包含输入了一个有效的字符串

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

strncpy
函数如果不适合就不会终止。在这种情况下,它不适合。因此没有终止。未以零字节结尾的内容不是合法字符串,因此您不能将指向它的指针作为第一个参数传递给
strcat
,但您可以这样做

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

这是通常建议您不要使用
strncpy
的原因之一——无法保证结果是有效字符串,并且很容易犯类似的错误。是的,您通过限制大小确保在调用
strncpy
时没有溢出缓冲区,但没有确保缓冲区包含输入了一个有效的字符串


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

从技术上讲,任何缓冲区最终都以零字节终止,因此任何缓冲区实际上都是合法字符串:)@m0skit0:否。如果在为缓冲区分配的空间内没有空字节,则缓冲区不是合法字符串。最终,缓冲区范围之外的某个地方会有一个零字节,可能会被视为字符串的终止,但在此之前很久,您就已经发生了“未定义行为”——任何事情都可能发生n、 从技术上讲,任何缓冲区最终都以零字节终止,因此任何缓冲区实际上都是合法字符串:)@m0skit0:No。如果在分配给缓冲区的空间内没有空字节,则缓冲区不是合法字符串。最终,缓冲区范围之外可能会有一个零字节被处理作为字符串的终止符,但在此之前很长一段时间内您就会出现“未定义行为”-任何情况都可能发生。使用
printf(MSG);
不是一个好主意;您应该使用
printf(“%s”,MSG);
。这一点并不重要,因为用户无法控制消息的内容,并且消息中不包含百分比符号(如果一切正常),但一般来说,对于用户提供的要打印的数据,您使用的内容可能是致命的。它们被称为“格式字符串漏洞”。使用
printf(MSG);
不是一个好主意;您应该使用
printf(“%s”,MSG);
在这里并不重要,因为用户无法控制消息的内容,并且消息不包含百分比符号(如果一切正常),但一般来说,对于用户提供的打印数据,您所使用的可能是致命的。它们被称为“格式字符串漏洞”。
#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;
}
            strncpy(LCD, tmpMSG, LCDSize);
            strcat(LCD,"\0");