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])

sincestrings[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

malloc単一の呼び出しでメモリを割り当てる場合は、非連続メモリの作成を避けてください。

  • 複数回の無料呼び出しではなく、1回の無料呼び出しでメモリを解放できます
  • 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 に答える
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 に答える