在这个例子中,我想学习如何动态分配内存。这是我的代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int n = 0;
char a[]="asd";
n = sizeof(a)/sizeof(char);
printf("\n %i \n\n",n);
char *corner;
corner = (char *)malloc(sizeof(char)*n);
strcpy(corner, a);
printf("\n %s \n\n",corner);
free(corner);
char b[]="asdddddddd";
n = sizeof(b)/sizeof(char);
corner = (char *)malloc(sizeof(char)*n);
strcpy(corner, b);
printf("\n %s \n\n",corner);
int x = sizeof(corner)/sizeof(corner[0]);
printf("\n %i \n\n",x);
return 0;
}
此代码的结果是:
4
asd
asdddddddd
4
所以我不知道如何正确使用malloc和free。代码的第一部分对我来说很清楚。首先我测量数组a
的长度,然后我创建指向与数组a
使用的内存长度相同的指针,接下来我将数组a复制到{{1}指向的内存中的另一个位置}。
打印字符串后我想重用*corner
,所以我释放内存并尝试定义新的数组长度,因为我想存储其他(更长或更短)的字符串。我不知道为什么,&#34; new&#34; corner
正在正确打印,但当我检查它时,它再次向我显示4。为什么? corner
只有4个字符长吗?如何用适当的长度重建角落?我知道这部分代码没有任何意义,但这仅适用于培训。
答案 0 :(得分:3)
int x = sizeof(corner)/sizeof(corner[0]);
sizeof(corner)
按预期为sizeof(pointer)
提供sizeof(array)
,系统中显示为sizeof(pointer) = 4 bytes
。
请注意,你的字符串应该\0
终止,你应该为你没有做的nul字符分配内存,这将导致未定义的行为。
答案 1 :(得分:0)
在你的代码中,corner
是一个char指针,它的大小是一个char指针的大小,无论它指向NULL,任何大小的char数组,还是内存中的任何地方!这就是为什么它的大小在32位系统上始终为4的原因。
答案 2 :(得分:0)
你获取刚刚创建的内存大小而不是数组的大小,所以,无法知道动态分配的数组的大小,它取决于你的计算机的体系结构是32位还是64位位,4个字节用于32位系统,8个字节用于64位系统。
答案 3 :(得分:0)
首先我测量数组a的长度,然后我正在创建指针 与数组a使用的内存长度相同,接下来我正在复制数组 a到* corner指向的内存中的另一个地方。
在这两种情况下,您使用sizeof( corner )
int x = sizeof(corner)/sizeof(corner[0]);
其中某个角的类型为char *
char *corner;
因此sizeof( corner )
等同于sizeof( char * )
,并且不依赖于指针指向的内存量。
指针不会保留有关它们是指向单个对象还是指向某个大小的数组的第一个对象的信息。
很快回答你的问题
为什么数组大小没有变化?
指针大小不会改变。:)
答案 4 :(得分:0)
在C中,只有返回指针才能识别malloc
ed地址指向的数组的大小。您需要手动维护数据结构来处理此类问题。否则,您只能获得sizeof
指针本身而已。
答案 5 :(得分:0)
正如有人已经在这里写的那样sizeof(corner)是你的记忆单词的大小 - 如果你在64位处编译,则在64位处理器上为8,在你的系统上为4,因为你很可能在32位上有一个linux而不是你编译的在32位。 或者你有一个64位的linux,你没有默认启用64位编译,你编译为32位。
要在32位或64位上编译,可以使用标志-m32或-m64作为gcc。
至于你的问题,通常无法知道指针分配了多少内存。
然而,在Linux上有一个函数可以做到这一点: Is it possible to find the Memory Allocated to the Pointer, without searching for the malloc statement
只做一个人malloc_usable_size
但是,我认为这个功能不起作用。
我设法使用了该函数,但它为指针返回的最小尺寸是24个八位字节。
我有64位linux,程序是64位编译的。
如果我分配25个八位字节,那么我将返回40个字节。
如果我分配100个八位字节,而不是我从函数返回的100个字节。