memcpy字符指针数组

时间:2018-03-07 04:06:07

标签: c

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]? 我附加了伪代码。

1 个答案:

答案 0 :(得分:1)

main中分配gbuffer的代码看起来正常。看起来你的函数dump试图做同样的事情。看起来,在dump内,它正确地分配了buffer。但最后,回到mainbuffer是不合适的。

这是因为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;
}