Проблемы в указателе на значение char * - PullRequest
1 голос
/ 26 июня 2011

В чем проблема с этим кодом (это правильно печатает arr [0], но я получаю проблемы с arr [1] ... печать некоторых странных символов):

using namespace std;
char ** setName() {
    char * arr[2];
    for (int i=0;i<2;i++)
       arr[i] = (char*)malloc(100);
    arr[0] = strdup("Robert");
    arr[1] = strdup("Jose");
    return arr;
}
int main()
{
    char **arr;
    arr = setName();
    printf("First name is %s\n", arr[0]);
    printf("Second name is %s\n", arr[1]);
    return 0;
}

Если это важноя запускаю этот код в Windows, используя Visual Studio 8.

Ответы [ 5 ]

5 голосов
/ 26 июня 2011

У вас есть две проблемы в этом коде:

  1. Массив auto, такой как ваш char * arr[2], не создается автоматически с new[]; его память уходит, когда функция возвращается. Это источник вашего мусора. Вы должны malloc() или new[] это.

    char **arr = malloc(2 * sizeof (*char));
    
  2. strdup() выполняет malloc(), поэтому вы бессмысленно malloc() сохраняете память, которая теряется из-за перезаписи указателя.

4 голосов
/ 26 июня 2011

Вы возвращаете адрес локальной переменной.arr не существует после выхода setName, поэтому main 'arr указывает на плохую память.

Вам лучше было бы писать прямо в main * arr передав его в качестве параметра setName:

using namespace std;
void setName(char* (&arr)[2]) {
    for (int i=0;i<2;i++)
       arr[i] = (char*)malloc(100);
    arr[0] = strdup("Robert");
    arr[1] = strdup("Jose");
}
int main()
{
    char * arr[2];
    setName(arr);
    printf("First name is %s\n", arr[0]);
    printf("Second name is %s\n", arr[1]);
    return 0;
}
2 голосов
/ 26 июня 2011

Ваш массив указателей является локальным для вашей функции setName.

Попробуйте что-то вроде:

char ** setName() {
  char ** arr = (char **)malloc(2 * sizeof(char *));
  for (int i=0;i<2;i++)
    arr[i] = (char*)malloc(100);
  strcpy(arr[0], "Robert");
  strcpy(arr[1], "Jose");
  return arr;
}

... и не забудьте free то, что вы malloc.

0 голосов
/ 27 ноября 2013

Ваш код может быть примерно таким:

    char *setName() {
        char * arr[2];
        static int j=0;
        int i=0;
        for (i=0;i<2;i++)
            arr[i] = (char*)malloc(100);
        strcpy(arr[0],"Robert");
        strcpy(arr[1],"Jose");
        return arr[j++];
    }

    int main(){
        char *arr1,*arr2;
        arr1 = setName();
        arr2 = setName();   
        printf("First name is %s\n", arr1);
        printf("First name is %s\n", arr2);
        return 0;
    }
0 голосов
/ 28 июня 2011

Вы возвращаете адрес обр. Это неопределенное поведение, и вы действительно не знаете, что произойдет. Я настоятельно рекомендую вам добавить параметр к этой функции по ссылке и просто передать arr из main вместо возврата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...