2

嘿,我在 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;
}

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

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

4

7 回答 7

6

运算符sizeof不会对指针执行您想要的操作。它会产生您机器上指针的大小(大概是 4 或 8)。

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


另请注意,您的循环未填写 0 终止符。

于 2012-04-13T21:11:14.633 回答
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;
}

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

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

希望能帮助到你。

于 2012-04-13T21:11:30.920 回答
4

当作为参数传递给函数时,具有大小信息的数组和字符串会退化为失去其大小属性的指针

因此,当您计算参数的大小时,s它会根据您的位数返回 32/64。

而不是sizeof,您实际上应该这样做strlen并向其添加一个以容纳空字符。

代替

char *t=malloc(sizeof(s));

尝试

char *t=malloc(strlen(s)+1);

请注意:

您的代码还有其他设计问题

  1. 当传递不应更改的指针参数时,应将其声明为 const。

  2. 通常,如果 cal-lee 忘记释放存储,则返回本地生成的堆存储的地址不是一个好习惯,并且是内存泄漏的主要原因。而是将其作为非常量参数传递给函数。

于 2012-04-13T21:12:00.840 回答
4

sizeof(s)返回其大小char *s为 4(在 32 位上)或 8(在 64 位上)系统。

于 2012-04-13T21:12:34.740 回答
1

sizeof返回指针的大小(通常为 4 或 8 个字节),而不是指向对象的大小。(没有办法获得后面的信息。顺便说一句, sizeof实际上是一个编译时常量。)

于 2012-04-13T21:12:57.183 回答
1

s是一个指向 char 的指针,因此malloc(sizeof(s))为一个指向 char 的指针分配空间——通常是 2-8 个字节,最常见的是 4 个字节。就目前而言,无论您传入的字符串长度如何,它都会始终分配这个固定数量的空间。在您的测试中,您传递的字符串比这长得多,因此您会溢出分配的缓冲区。

你已经给出了正确的答案:在这种情况下,strlen找到大小的函数是正确的。

于 2012-04-13T21:14:13.910 回答
0

malloc 在 中声明,因此我们在任何调用 malloc 的程序中#include 那个头文件。根据定义,C 中的“字节”是适合存储一个字符的存储量,因此上述 malloc 调用为我们提供了与我们要求的一样多的字符。我们可以这样说明生成的指针:

于 2014-02-03T06:32:42.667 回答