2016-05-04 2 views
-2

я пытаюсь создать функцию, которая возвращает указатель на структуру здесь код:с функция, возвращающая указатель на структуру

структура:

struct Nia{ 
    char NIA[6]; 
}; 

функция:

struct Nia * prueba(){ 
    struct Nia *nia = malloc(sizeof(struct Nia)*2); 
    strcpy(nia[0].NIA,"11111\0"); 
    strcpy(nia[1].NIA,"11112\0"); 
    return nia; 
} 

Основная функция: (не печатает ничего, но он должен напечатать 11111)

int main(int argc, char** argv) { 

    struct Nia *nia = prueba(); 

    printf("%s\n",nia[0].NIA); 

return (EXIT_SUCCESS); 

} 

где проблема? Я думаю, что я правильно выполняю указатели на структуры, не так ли?

он фактически возвращает ошибку сегментации.

благодарит заранее!

+2

nia [0] .NIA или вы имеете в виду nia-> NIA [0]? – Michi

+0

Это работает в моей системе. Наличие явного '\ 0' в строке необычно [и _not_ рекомендуется], но не _not_' UB'. 'Strcpy' остановится на _it_, хотя исходная строка выглядит так:' '11111 \ 0 \ 0" ', поэтому будет скопировано только 5 символов + EOS. –

+0

Здесь тоже работает, и никаких жалоб от [valgrind] (см. http://valgrind.org). – dbush

ответ

1

Я скомпилировал и побежал следующий test.c файл на Linux Mint 64 бит с использованием gcc -o test test.c -Wall

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

struct Nia{ 
    char NIA[6]; 
}; 

struct Nia * prueba(){ 
    struct Nia *nia = malloc(sizeof(struct Nia)*2); 
    strcpy(nia[0].NIA,"11111\0"); 
    strcpy(nia[1].NIA,"11112\0"); 
    return nia; 
} 

int main(int argc, char** argv) { 

    struct Nia *nia = prueba(); 

    printf("%s\n",nia[0].NIA); 

return (EXIT_SUCCESS); 

} 

выводит 11111 и компилирует без жалоб. Честно говоря, даже если я опускаю заголовки include d, он будет запущен, albiet с предупреждениями, но ваша система может быть другой, поэтому просто включите их, и вы должны быть в порядке.

Конечно, подумав об этом еще, это может быть проблематично, если вы используете C++ не C, что не тот же язык. Понимаете, у g++ возникнет проблема с присвоением значения void*, которое malloc() вернется к символу типа Nia*, тогда как gcc с радостью сделает для вас преобразование. Другой компилятор C++, который вы можете использовать, может позволить вам скомпилировать его, но void не имеет членов, поэтому член NIA, возможно, не был инициализирован, что приводит к segfault при попытке распечатать его. Чтобы быть абсолютно уверенным, используйте отладчик и найдите, где происходит нарушение доступа к памяти.

UPDATE: только что запустил это в Netbeans на той же системе, прошел нормально.

+0

Для полноты добавьте '#include ' и должны быть предупреждения _no_. –

+0

Да, и на самом деле 'strcpy' из' string.h', а не 'stdlib.h': P – ocket8888

+0

Это тоже у меня. Я забыл, когда написал комментарий –

Смежные вопросы