2

我在 C 中使用动态字符串数组:

char** strings;

我初始化它:

int max = 10;
strings = malloc(sizeof(char*) * max);

并复制几个虚拟字符串:

char* str = "dummy";
for (int i = 0; i < max; i++) {
  strings[i] = malloc(strlen(str) + 1);
  strncpy(strings[i], str, strlen(str) + 1);
}

然而,当我尝试打印这个时:

for (int i = 0; i < max; i++)
  printf("array = %s", strings[i])

我从 Splint 收到此错误:

Value strings[] used before definition
  An rvalue is used that may not be initialized to a value on some execution
  path. (Use -usedef to inhibit warning)

像这样检查NULL无济于事:

for (int i = 0; i < max; i++)
  if (strings[i] != NULL)
    printf("array = %s", strings[i])

因为strings[i]仍然在“定义之前”使用。

关于如何解决这个问题的任何想法?

编辑:我想,我会用链表来试试这个。

另外,完整的代码清单:

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

int main()
{
    char** strings;
    int i;
    int max = 10;
    char* str = "hello";

    // Dynamic array with size max
    strings = malloc(sizeof(char*) * max);

    // Abort if NULL
    if (strings == NULL)
        return (-1);

    // Define strings
    for (i = 0; i < max; i++)
    {
        strings[i] = malloc(strlen(str) + 1);

        // Abort if NULL
        if (strings[i] == NULL)
        {
            // Undetected memory leak here!
            free(strings);
            return (-1);
        }

        strncpy(strings[i], str, strlen(str) + 1);
    }

    // Print strings
    for (i = 0; i < max; i++)
    {
        if (strings[i] != NULL)
            printf("string[%d] = %s\n", i, strings[i]);
    }

    // Free strings
    for (i = 0; i < max; i++)
    {
        if (strings[i] != NULL)
            free(strings[i]);
    }
    free(strings);

    return 0;
}
4

2 回答 2

0

我的机器上没有 Splint,所以我无法用它进行测试,这只是您完成任务的另一种方式:

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

int main()
{
  int i, len, max;
  char* str = "hello";

  len = strlen(str) + 1;
  max = 10;

  char strings[max][len];

  for (i = 0; i < max; i++) {
    strcpy(strings[i], str);
  }

  for (i = 0; i < max; i++) {
    printf("string[%d] = %s\n", i, strings[i]);
  }

  return 0;
}
于 2014-08-15T12:08:09.950 回答
0

避免创建非连续内存,如果您在单个malloc调用中分配内存,这将是更好的方法。

  • 内存可以在一次免费调用中释放,而不是多次免费调用
  • max_rows * sizeof(char)将分配 2 * 1
  • ((strlen(str) * N) + 1)将为每个N元素分配内存。

这是我的方法

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

int main(){

    size_t max_rows = 2;

    char* str = "dummpy";
    char* vec_s = (char *) malloc( max_rows * sizeof(char) * ((strlen(str) * max_rows) + 1));

    for (int i = 0; i < max_rows; i++){
        strcpy((vec_s + i), str);
        printf("vec_s[%d]=%s\n", i, (vec_s + i));
    }
    free(vec_s);
    return 0;
}
于 2014-08-15T13:43:46.103 回答