Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 我应该更改指向数组的指针吗? for(int a=0;a_C_Malloc_Buffer_Dynamic Memory Allocation - Fatal编程技术网

C 我应该更改指向数组的指针吗? for(int a=0;a

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 =

由于缓冲区仅分配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 = malloc(a); //yes, the cast is not required
然后,我也会写作

 int * p = malloc(10 * sizeof*p);
for(int i=0;i<10,i++)
p[i]=i;
因为,我已经为10
int
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;