【问题标题】:memcpy character pointer arraymemcpy 字符指针数组
【发布时间】:2018-08-15 02:01:27
【问题描述】:
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() 中的缓冲区 [0]? 我附上了伪代码。

【问题讨论】:

  • 这还能编译吗?
  • 你没有为你的buffer分配任何内存。
  • 我知道,我只是想知道如何访问缓冲区的值 我是 C 新手
  • memcopy(&amp;buffer, &amp;gbuffer, sizeof(gbuffer));buffer = gbuffer; 相同
  • 我附上了伪代码,请看。帮助

标签: c


【解决方案1】:

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

这是因为dump 分配内存并将其存储在dumpbuffer 指针副本中,但它不会传播回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;
}

【讨论】:

  • 谢谢,很有用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-27
  • 1970-01-01
  • 1970-01-01
  • 2011-06-26
相关资源
最近更新 更多