C 语言中动态数组的大小不变



我正在为一个程序realloc(): invalid next size。所以我只是编写了这个代码来理解发生了什么。

#include <stdio.h>
#include <stdlib.h>
int main()
{
    char *inp;
    printf("%lu ",sizeof(inp));
    char *res = (char*)malloc(15*sizeof(char*));
    printf("%lu ",sizeof(res));
    res = "hello world";
    printf("%lun",sizeof(res));
    return 0;
}

令人惊讶的是,它输出8 8 8.谁能解释为什么会这样?为什么默认是8?malloc()如何影响inp的大小?

sizeof(inp)为您提供指针的大小(8 字节,64 位(,而不是该指针下的存储。

您正在使用sizeof .return size 以字节为单位的类型对象表示形式。请记住 sizeof 是一个运算符。

现在 sizeof 回到这里 8 一种恒定类型的size_t

为什么它没有改变?因为在所有情况下,您都在使用与char *相同的类型。

这里的 8 个字节是字符指针的大小,即 64 位。

你大概可以看看这个——

printf("size of array of 10 int: %dn" sizeof(int[10]));

这将给出输出:40 . 40 字节。

而且malloc永远不会影响char*的大小.它仍然需要 64 位来存储堆中动态分配的空间的地址。

是否可以在 c 中确定动态分配的内存大小?

没有标准的方法可以做到这一点。你必须自己承担这个开销。您可能会找到编译器的一些扩展可以完成此操作。

sizeof(inp)在您

的情况下是sizeof(pointer)的,因此系统上的sizeof(char-pointer)是8字节,这是一个常量。在使用malloc()分配内存时,您会指定大小,那么为什么需要再次获取分配空间的大小呢?

我看到res正在初始化而不是inp

> ****EDIT**** : 下面的帖子是在编辑问题之前写的。

您最多缺少stdlib.h功能malloc()正常工作。然后

要点 1:

char *res = (char*)malloc(15*sizeof(char*));

应该是

char *res = malloc(15);   //will also issue warning to resolve missing stdlib.h

没有注意:您应该为 char 秒分配内存,而不是char *秒。那么,你应该写sizeof(char),而不是sizeof(char *)。此外,sizeof(char)始终是 1/C .所以,可以省略那部分。

请阅读:不要在C中强制转换malloc()和 family 的返回值。

要点 2:

字符串不应分配给malloc()的 ed 指针。 请改用strcpy()

 inp = "hello world";

应该是

strcpy(inp, "hello world");

否则,您将覆盖以前分配的内存,由 malloc() 返回。分配将覆盖inp持有的内存位置,从而导致内存泄漏。

第3点。

运算符返回sizeof()size_t 。要打印它,您需要%zu格式说明符。

相关,摘自C11标准文件第§7.21.6.1章第7段,

Z

指定以下 d、i、o、u、x 或 X 转换说明符适用于 size_t或相应的有符号整数类型参数;或者一个 以下 N 转换说明符适用于指向有符号整数类型的指针 对应于size_t参数。


然后,要回答有关输出的查询,在所有情况下,您都会打印sizeof(inp)它本质上是sizeof(char *)的,并且该值对于特定平台是固定的(在您的情况下8(。

仅供参考,sizeof()是一个运算符,它不是一个函数。它返回数据类型的大小,而不是变量指向的空间量

相关内容

  • 没有找到相关文章