Splint:“定义之前使用的值字符串[]与动态数组

时间:2014-08-15 11:22:37

标签: c dynamic-arrays splint

我在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;
}

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

如果在单malloc次呼叫中分配内存,则避免创建非连续内存,这将是更好的方法。

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

这是我的approch

#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;
}