malloc(sizeof(s))分配的内存少于预期?

ksb*_*ksb 2 c malloc

嘿,我在malloc中使用sizeof运算符时遇到问题.例如,请参阅下面的内容.码-

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char * copy(char *s)
{
    char *t=malloc(sizeof(s));
    char *ptr=s;
    int i=0;
    do
    {
        t[i++]=*ptr++;
    }
    while(*ptr!='\0');
    return t;
}
int main()
{
    char *s="hello adsjahsjkdhjkashdkjaskdasldjlasjdlajsdlkjaslkdjalsjdlasjdljasdljasdkljklsdjlasdsadasdasd";
    char *b=copy(s);
    printf("%s\n",b);
    free(b);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在ideone上,它给出错误: - *glibc检测到./prog:free():下一个大小无效(快):0x09bcf008**

但是当我用malloc(strlen(s)+1)替换malloc(sizeof(s))时,程序运行得很好.所以有什么问题?注意:这只是我创建的一个小程序,用于演示我在另一个代码中遇到的问题.

cni*_*tar 6

运算符sizeof不会在指针上执行您想要的操作.它会产生机器上指针的大小(类似于4或8).

您可以这样想:数组在传递给函数时衰减到指针,并且有关其大小的信息"丢失".


另请注意,您的循环不会填充0终止符.


Cac*_*nta 6

你应该在函数中使用strlen而不是sizeofcopy:

char * copy(char *s)
{
    char *t=malloc(strlen(s) + 1);
    char *ptr=s;
    int i=0;
    do
    {
        t[i++]=*ptr++;
    }
    while(*ptr!='\0');
    return t;
}
Run Code Online (Sandbox Code Playgroud)

问题是sizeof不返回你需要的值,该函数将返回大小char *s(可能是4或8 - >用于存储指针的字节).查看文档链接以更清楚地了解.

还有一件事,如果你这样做是为了练习你的C技能是可以的,但如果你不这样做,你很可能只想使用strcpy函数.

希望能帮助到你.

  • 仍然不够......"strlen"不计算空终止符. (2认同)