char **gbuffer = NULL;
void dump(char **buffer)
{
int i;
buffer = realloc(buffer, 50 *sizeof(char **));
for(i = 0 ; i < 10; i++)
{
buffer[i] = malloc(50 *sizeof(char));
buffer[i] = gbuffer[i];
}
printf("string is %s\n", buffer[0]); //able to access here
}
int main()
{
char **buffer = NULL;
gbuffer = realloc(gbuffer, 50 *sizeof(char **));
int i;
for(i =0 ;i < 10; i++)
{
gbuffer[i] = malloc(50 * sizeof(char));
strcpy(gbuffer[i], "ashish");
}
dump(buffer);
printf(" global string is %s\n", gbuffer[0]);
printf("string is %s\n", buffer[0]); //not able to access this value
return 0;
}
我能够访问dump()中的缓冲区但无法访问main中的变量。 如何访问main()中的buffer [0]? 我附加了伪代码。
答案 0 :(得分:1)
main
中分配gbuffer
的代码看起来正常。看起来你的函数dump
试图做同样的事情。看起来,在dump
内,它正确地分配了buffer
。但最后,回到main
,buffer
是不合适的。
这是因为dump
分配内存并将其存储在dump
指针的buffer
副本中,但它不会传播回main
。
(这是一个非常常见的问题。通过权利,我不应该回答它;我应该指出你在数百个重复问题中的一个。)
解决此问题的一种方法是让dump
返回buffer
的新值。我还更改了dump
的名称,因为它不仅仅是转储它传递的缓冲区。我还解决了其他几个问题,我稍后会解释。
char **gbuffer = NULL;
char ** reallocate_and_dump(char **buffer)
{
int i;
buffer = realloc(buffer, 50 * sizeof(char *));
for(i = 0; i < 10; i++)
{
buffer[i] = malloc(50);
strcpy(buffer[i], gbuffer[i]);
}
printf("string is %s\n", buffer[0]);
return buffer;
}
int main()
{
char **buffer = NULL;
gbuffer = realloc(gbuffer, 50 * sizeof(char *));
int i;
for(i = 0; i < 10; i++)
{
gbuffer[i] = malloc(50);
strcpy(gbuffer[i], "ashish");
}
buffer = reallocate_and_dump(buffer);
printf(" global string is %s\n", gbuffer[0]);
printf("string is %s\n", buffer[0]);
return 0;
}
你说的是buffer = realloc(buffer, 50 * sizeof(char **))
之类的东西,但那不太对劲。 buffer
拥有50 char *
个。所以你想要buffer = realloc(buffer, 50 * sizeof(char *))
。
您说的是buffer[i] = malloc(50 * sizeof(char))
之类的内容,但不需要乘以sizeof(char)
,因为根据定义,sizeof(char)
正好是1.所以我已将这些内容更改为buffer[i] = malloc(50)
你有一对行
buffer[i] = malloc(50 * sizeof(char));
buffer[i] = gbuffer[i];
这里你分配50个字节的内存,然后通过用gbuffer
数组中的不同指针覆盖指针立即浪费它。这很令人困惑,可能不是你想要的。我用
buffer[i] = malloc(50 * sizeof(char));
strcpy(buffer[i], gbuffer[i]);
我认为更有意义。
另一种可能性,即让reallocate_and_dump
更新并返回它所指向的指针的另一种方法是让它接受指向该指针的指针。但是由于它所指向的指针已经是一个两级指针,我们最终得到一个三级指针,我不知道你,但是三级指针有让我的头爆炸的倾向。不过,这就是代码的样子:
void reallocate_and_dump_2(char ***buffer_pointer)
{
int i;
char **buffer = *buffer_pointer;
buffer = realloc(buffer, 50 * sizeof(char *));
for(i = 0; i < 10; i++)
{
buffer[i] = malloc(50);
strcpy(buffer[i], gbuffer[i]);
}
printf("string is %s\n", buffer[0]);
*buffer_pointer = buffer;
}
int main()
{
char **buffer = NULL;
gbuffer = realloc(gbuffer, 50 * sizeof(char *));
int i;
for(i = 0; i < 10; i++)
{
gbuffer[i] = malloc(50 * sizeof(char));
strcpy(gbuffer[i], "ashish");
}
reallocate_and_dump_2(&buffer);
printf(" global string is %s\n", gbuffer[0]);
printf("string is %s\n", buffer[0]);
return 0;
}