嘿,我在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))时,程序运行得很好.所以有什么问题?注意:这只是我创建的一个小程序,用于演示我在另一个代码中遇到的问题.
运算符sizeof不会在指针上执行您想要的操作.它会产生机器上指针的大小(类似于4或8).
您可以这样想:数组在传递给函数时衰减到指针,并且有关其大小的信息"丢失".
另请注意,您的循环不会填充0终止符.
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函数.
希望能帮助到你.