В вашем коде:
person * setName() {
person * array;
array = malloc (2 * sizeof(person));
array->name = strdup("Robert");
array++;
array->name = strdup("Jose");
return array;
}
Вы выделяете пространство для двух элементов в массиве и устанавливаете array
для указания на первый:
+-------+ +----------+
| array | ---> | array[0] |
+-------+ +----------+
| array[1] |
+----------+
Затем вы увеличиваете указатель элемента на array++
и , что - это то, что возвращается в вызывающую функцию в конце. Этот указатель указывает на элемент массива second , поэтому он кажется неправильным (и почему вы почти наверняка потерпите крах при попытке освободить эту память позднее):
+-------+ +----------+
| array | -+ | array[0] |
+-------+ | +----------+
+-> | array[1] |
+----------+
Что вам нужно:
person * setName() {
person * array;
array = malloc (2 * sizeof(person));
array[0].name = strdup("Robert");
array[1].name = strdup("Jose");
return array;
}
как вы уже указали. Это решение не вообще меняет указатель array
. Но, если вы действительно хотите использовать указатели, вы можете просто изменить действия array++
с помощью array--
перед возвратом, чтобы array
вернулось к правильному значению:
person * setName() {
person * array;
array = malloc (2 * sizeof(person));
array->name = strdup("Robert");
array++;
array->name = strdup("Jose");
array--;
return array;
}
Или, другой способ, который не меняет исходный указатель, не использует индексирование массива и не использует второй указатель, - это использование арифметики указателя. Компилятор знает, на какой тип указывает указатель, поэтому он может корректно настроить указатель для поиска следующего элемента (вы уже знаете, что он знает, как это сделать, поскольку array++
является сокращением для array = array + 1
, и этот оператор корректирует значение с помощью правильного сумма также):
person * setName() {
person * array;
array = malloc (2 * sizeof(person));
(array+0)->name = strdup("Robert");
(array+1)->name = strdup("Jose");
return array;
}