c sizeof()导致溢出? #包括 #包括 #包括 内部主(空) { char*p; char*q; char*l=“aaaaa sdfsfdqwecvxfwdsagfd”; p=(char*)malloc(sizeof(l)); q=(char*)malloc(strlen(l)); strcpy(p,l); strcpy(q,l); printf(“%s\n”,p); printf(“%s\n”,q); printf(“%d\n”,strlen(l)); 返回0; }

c sizeof()导致溢出? #包括 #包括 #包括 内部主(空) { char*p; char*q; char*l=“aaaaa sdfsfdqwecvxfwdsagfd”; p=(char*)malloc(sizeof(l)); q=(char*)malloc(strlen(l)); strcpy(p,l); strcpy(q,l); printf(“%s\n”,p); printf(“%s\n”,q); printf(“%d\n”,strlen(l)); 返回0; },c,pointers,sizeof,C,Pointers,Sizeof,请看这个,当输入23个字符以内的一些字符时,没关系,而输入超过23个字符时,如图片所示,我的结果显示为混乱的代码,为什么会发生这种情况? 对指针执行sizeof操作时,得到的是指针的大小,而不是指针指向的内存。这通常是4或8,取决于您是在32位还是64位系统上 然后strlen返回不带空终止符的字符串长度 这两个大小都太小,无法用终止符容纳整个字符串,当strcpy调用超出范围时会导致未定义的行为。不要将代码作为图像发布,这很可怕。您没有分配足够的内存,缺少空终止字符。可能是问题,但现在我得做眼

请看这个,当输入23个字符以内的一些字符时,没关系,而输入超过23个字符时,如图片所示,我的结果显示为混乱的代码,为什么会发生这种情况?

对指针执行
sizeof
操作时,得到的是指针的大小,而不是指针指向的内存。这通常是4或8,取决于您是在32位还是64位系统上

然后
strlen
返回不带空终止符的字符串长度


这两个大小都太小,无法用终止符容纳整个字符串,当
strcpy
调用超出范围时会导致未定义的行为。

不要将代码作为图像发布,这很可怕。您没有分配足够的内存,缺少空终止字符。可能是问题,但现在我得做眼科手术,所以请原谅。对不起……这是我第一次问有关stackoverflow的问题,我会解决的。谢谢我不认为addin null termination char在这里起作用,它已经存在我明白了!谢谢。但我仍然有一个问题,当我对指针进行sizeof时,我得到一个4字节的mem,而我输入的字符串超过4个字符,实际上它有23个字节,所以为什么我可以得到超过4个正确字符的输出?@LiuYikai要获得正确长度的字符串,你应该使用
strlen
。要获得包含终止符的字符串的长度,您需要在
strlen
返回的长度中添加一个(即在您的示例中
strlen(l)+1
),我的意思是,使用“sizeof”分配4个字节来存储4个字符,这里的空间存储23个字符(字节),超过4个字节,对吗?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
    char *p ;
    char *q ;
    char *l = "aaaaaasdfsfdqwecvxcxfwdsagfd" ;
    p = (char*)malloc(sizeof(l)) ;
    q = (char*)malloc(strlen(l)) ;
    strcpy(p, l) ;
    strcpy(q, l) ;
    printf("%s\n",p) ;
    printf("%s\n",q) ;
    printf("%d\n",strlen(l)) ;
    return 0 ;
}