C 我应该更改指向数组的指针吗? for(int a=0;a
由于缓冲区仅分配1个字符长度 不,这里不是这样 引用C 我应该更改指向数组的指针吗? for(int a=0;a,c,malloc,buffer,dynamic-memory-allocation,C,Malloc,Buffer,Dynamic Memory Allocation,由于缓冲区仅分配1个字符长度 不,这里不是这样 引用C11标准第§7.22.3.4章中的malloc功能 void*malloc(大小); malloc函数为大小由size和指定的对象分配空间 其值是不确定的 那么,万一 for (int a=0; a<10; ++a) { printf ("%d", a); } char *foo; foo = (char*)malloc(a); 考虑到malloc()成功,将分配与a值大小相同的内存 简单地说,如果我写一段像 foo =
C11
标准第§7.22.3.4章中的malloc
功能
void*malloc(大小);
malloc
函数为大小由size
和指定的对象分配空间
其值是不确定的
那么,万一
for (int a=0; a<10; ++a) {
printf ("%d", a);
}
char *foo;
foo = (char*)malloc(a);
考虑到malloc()
成功,将分配与a
值大小相同的内存
简单地说,如果我写一段像
foo = malloc(a); //yes, the cast is not required
然后,我也会写作
int * p = malloc(10 * sizeof*p);
for(int i=0;i<10,i++)
p[i]=i;
因为,我已经为10int
s分配了所需的内存
也就是说,.好吧,foo现在指向
a
字节的一些可用地址,因为这就是malloc()
的工作方式。它的类型是char*
,void*
还是其他类型都不重要,您只能使用a
字节
这里,您将
a
增加到10。这意味着您可以从foo
指向的地址开始存储10个字节,即10个char
s(因为在C上下文中,1个char=1个字节)。使用指针或数组是严格等效的。在这种情况下,您可以做一些事情
char foo[10];
如果您知道要存储的字符总是10个(或更少)malloc
动态分配内存。现在使用malloc时,您可以指定12个字符需要多少字节的内存,您可以使用malloc(12)
或malloc(12*sizeof(char))
。使用malloc时,您需要在使用完内存后手动释放内存,因此能够请求任意(在限制范围内)大小的内存的好处是以增加内存管理难度为代价的
作为旁注:您通常不想强制转换
malloc
的返回值,因为它可以隐藏某些类型的bug和void*
,因此malloc
返回值可以隐式强制转换为任何指针类型。您所说的“我想保存多个foo变量”是什么意思?@Magix我是说商店,对不起。我修好了。请阅读malloc()的手册页
。注意:不要将malloc
&friends的结果用C进行强制转换。如果其中一个答案解决了您的问题,您应该这样做。我现在就知道了。谢谢@MagixSo,因为我已经分配了10个字节,所以我的最长可打印长度是10个字节。任何更多的内容都会导致缓冲区溢出,对吗?是的,绝对正确。在分配的空间中写入更多内容将导致它在缓冲区溢出中,可能导致分段错误。Nit:1 char=1 byte始终。在C上下文中,“byte”和“char”是同义词。这与系统无关。因为a的值是10。如果malloc()成功,我可以安全地存储10个字节?@suitedpvet83在这种情况下,是的,您当然可以。:)
for (int i = 0; i < 10, i++)
p[i] = i;