1

const char*要素をメインに出力できるように、関数から配列を取得する際に助けが必要です。

主要:

const char* values[3];
strings_to_array();

printf("%s\n", values[1]);
printf("%s\n", values[2]);

関数:

const char* strings_to_array()
{
    char one_str[16];
    char two_str[16];
    char three_str[16];

    strcpy(one_str, "one");
    strcpy(two_str, "two");
    strcpy(three_str, "three");

    const char* values[] = {one_str, two_str, three_str};
    return values;
}

ここで間違っていることと、値をメインに取得する方法を教えてください。

4

6 に答える 6

9

このコードの主な問題は、C の関数はローカル変数へのポインターを返すべきではないということです。これは、スタックに格納されているためです。つまり、関数が戻ると、それらは使用できなくなります。

したがって、この行:

const char* values[] = {one_str, two_str, three_str};

次のものに置き換えることができます。

const char** values = malloc(3*sizeof(char *));
values[0] = strdup(one_str);
values[1] = strdup(two_str);
values[2] = strdup(three_str);

上記の例の完全な作業コード:

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

const char** strings_to_array()
{
    char one_str[16];
    char two_str[16];
    char three_str[16];

    strcpy(one_str, "one");
    strcpy(two_str, "two");
    strcpy(three_str, "three");

    const char** values = malloc(3*sizeof(char *));
    values[0] = strdup(one_str);
    values[1] = strdup(two_str);
    values[2] = strdup(three_str);
    return values;
}

int main() {
  const char** values = strings_to_array();

  printf("%s\n", values[1]);
  printf("%s\n", values[2]);

  free((void *)values[0]);
  free((void *)values[1]);
  free((void *)values[2]);
  free(values);      

  return 0;
}
于 2013-06-07T10:40:27.947 に答える
1
  1. const char*戻り値の型を asと宣言し、 を返そうとしているため、構文的に間違っていますconst char**

  2. スタックに割り当てられた配列へのポインターを返そうとしているため、意味的に間違っています。

于 2013-06-07T10:39:19.583 に答える
0

1 つの方法は、その関数の外で変数にアクセスするため、変数を static として宣言することです。関数を終了しても、それらのメモリが失われないことを意味します。char **また、 の代わりにa を返す必要がありますchar *

const char** strings_to_array()
{
    static char one_str[16];
    static char two_str[16];
    static char three_str[16];

    strcpy(one_str, "one");
    strcpy(two_str, "two");
    strcpy(three_str, "three");

    static const char* values[] = {one_str, two_str, three_str};
    return values;
}
于 2013-06-07T10:43:54.960 に答える
0

main の「values」という名前の文字ポインタの配列を初期化するものは何もありません。その機能は何をすることになっていますか?何もせず、その戻り値は main では無視されます。

于 2013-06-07T10:39:04.700 に答える
0

変数 one_str、two_str、three_str、および値は、'strings_to_array' 関数のローカル変数です。それらは、この機能の外では有効な存在を持ちません。

「値」(つまり、ローカル変数へのポインター) を返すと、無効なメモリ位置へのポインターが返されます。

于 2013-06-07T10:40:17.193 に答える