Размещенный код не компилируется:
- Вы не можете использовать
struct
в качестве имени переменной.struct
- это ключевое слово. Random
- это глобальная переменная, а не тип.
В C идиоматично и намного проще вернуть результат вместо передачи егоaddress в качестве аргумента.
После этих замечаний и добавления базовых проверок код должен быть упрощен как:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Random {
char *email;
} Random;
Random *function(void) {
char *temp = calloc(100, sizeof(char));
if (temp == NULL)
return NULL;
Random *s = calloc(5, sizeof(Random));
if (s != NULL) {
for (int i = 0; i < 5; i++) {
if (scanf("%99s", temp) != 1)
*temp = '\0';
(s + i)->email = strdup(temp); //This works
}
free((s + 3)->email); //Gives segmentation fault
}
free(temp);
return s;
}
int main() {
Random *s = function();
// ...
}
Этот код, семантически эквивалентный вашему опубликованному фрагменту, не имеет неопределенногоПоведение, где вы указываете, ваш реальный код должен делать что-то еще.