Realloc设置指针为空

时间:2015-05-14 02:30:03

标签: c realloc

void test(){
   char *c = malloc(strlen("I like coffe") + 1);
   strcpy(c, "I like coffe");
   char **s = &c;
   while(strlen(*s) < 25)
      my_function(s);
}

void my_function(char **s){
  char *w  = *s;   

  char *tmp = realloc(w, len + 2);//Error HERE. *s gets = ""
  if(tmp != NULL)
  w = tmp;
  for(i= len; i>=p; i--){
      w[i+1] = w[i];
  }
  w[p] = c;    
}  

此功能用于在char *内插入新字符 此外,此函数位于while循环内。它工作正常但是第三次​​循环运行时,它只设置*s = "" 我认为通过使用char *tmp我可以保留数据,如果发生任何错误的事情。我无法理解为什么P *s被设置为空字符串。

1 个答案:

答案 0 :(得分:3)

您忘记在包含*s的函数中将新值分配给realloc()

void test(void)  // Unaltered; still broken!
{
    char *c = malloc(strlen("I like coffe") + 1);
    strcpy(c, "I like coffe");
    char **s = &c;
    while (strlen(*s) < 25)
        my_function(s);
}

void my_function(char **s)  // Fixed one way
{
    char *w  = *s;   
    size_t len = strlen(w) + 1;  // Define and initialize len

    char *tmp = realloc(w, len + 2);
    if (tmp != NULL)
        w = tmp;
    *s = w;  // Reassign to `*s`
}

或者更简单:

void my_function(char **s)  // Fixed another way
{
    char *w  = *s;   
    size_t len = strlen(w);  // Define and initialize len

    char *tmp = realloc(w, len + 2);
    if (tmp != NULL)
        *s = tmp;  // Reassign to `*s`
}

分配给w仅设置局部变量,该变量是*s的副本;它不会重置调用代码中的指针。

请注意,即使使用此修复程序,test()中的循环也会运行很长时间,因为没有任何内容会更改c中字符串的长度。还有另一个问题:您未将s的地址传递给my_function(),因此my_function()无法修改s

void test(void)
{
    char *c = malloc(strlen("I like coffe") + 1);
    strcpy(c, "I like coffe");
    while (strlen(c) < 25)
    {
        my_function(&c);
        strcat(c, "AZ");  // Grow string — not good in real code
        printf("%2zu: <<%s>>\n", strlen(c), c);
    }
}

void my_function(char **s)
{
    char *w = *s;   
    size_t len = strlen(w) + 1;  // Define and initialize len

    char *tmp = realloc(w, len + 2);
    if (tmp != NULL)
        *s = tmp;  // Reassign to `*s`
}

这消除了指向test()中char的指针。如果这是至关重要的,那么还有更多的想法要做。

代码尚未正式测试!

现在测试的代码 - 你能说“猪的耳朵”吗? Copy'n'paste错误的材料使我的测试代码失败。这是仪表化的工作版本 - valgrind给它一个干净的健康状况。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static void my_function(char **s)
{
    char *w = *s;
    size_t len = strlen(w) + 1;  // Define and initialize len
    printf("M1: %p: %2zu: <<%s>>\n", (void *)w, len, w);

    char *tmp = realloc(w, len + 2);
    if (tmp != NULL)
        *s = tmp;  // Reassign to `*s`
    printf("M2: %p: %2zu: <<%s>>\n", (void *)*s, strlen(*s), *s);
}

static void test(void)
{
    char *c = malloc(strlen("I like coffe") + 1);
    if (c == 0)
    {
        fprintf(stderr, "Out of memory\n");
        exit(EXIT_FAILURE);
    }
    strcpy(c, "I like coffe");
    printf("T1: %p: %2zu: <<%s>>\n", (void *)c, strlen(c), c);
    while (strlen(c) < 25)
    {
        my_function(&c);
        printf("T2: %p: %2zu: <<%s>>\n", (void *)c, strlen(c), c);
        if (c == NULL)
        {
            fprintf(stderr, "Out of memory\n");
            exit(EXIT_FAILURE);
        }
        strcat(c, "AZ");  // Grow string — not good in real code
        printf("T3: %p: %2zu: <<%s>>\n", (void *)c, strlen(c), c);
    }
    free(c);
}

int main(void)
{
    test();
    return 0;
}