нужна базовая помощь по структуре - PullRequest
0 голосов
/ 09 марта 2012

Я хочу скопировать значения в struct с помощью указателя.

Я продолжаю получать ошибку сегментации из этого небольшого куска кода.

struct companyInfo
{
    double sharePrice;
    char companyName[100];
}; 

int main()
{
    struct companyInfo * pdata = NULL;
    strcpy(pdata->companyName, "sdfsd");

    exit(0);
}

Ответы [ 4 ]

6 голосов
/ 09 марта 2012

Вы не выделяете никакого пространства для структуры, просто указатель, который является нулевым.

struct companyInfo * pdata = NULL; 
pdata = calloc( 1, sizeof(struct companyInfo) ); 
if( pdata != NULL )
    {
    strncpy(pdata->companyName, "sdfsd", sizeof(pdata->companyName) - 1);
    }

Примечание: calloc() также обнулит память для вас, в отличие от malloc()который просто выделит.Кроме того, вы должны проверить возврат этих функций, чтобы убедиться, что указатель не равен NULL.

Важно: Любая память, выделенная с помощью malloc (), calloc (), ex .., должнабыть явно освобожденным.

Пример:

if( pdata != NULL )
    {
    free( pdata );
    }
exit(0);
1 голос
/ 09 марта 2012

Попробуйте это:

int main() {
    struct companyInfo pdata;
    pdata.companyName = "sdfsd";
}

Вы можете установить все переменные в структуре сразу:

struct companyInfo pdata = { 2.3425, "company" };

Совет: используйте typedef перед использованием struct:

typedef struct companyInfo companyInfo;

Так что вам не нужно каждый раз вводить "struct companyInfo". Теперь вы можете просто использовать:

companyInfo pdata;

Надеюсь, я помог:)

1 голос
/ 09 марта 2012

companyInfo - указатель на структуру, и этот указатель указывает на NULL.Поэтому, когда вы пытаетесь разыменовать его, вы получаете ошибку сегмента.Вам нужно либо использовать malloc, чтобы выделить место для указателя структуры, чтобы указать на него, либо объявить структуру в стеке.

Для целей вашего упражнения я бы выбрал вариант 2, так какпроще.Просто сделайте:

int main()
{

    struct companyInfo pdata;
    strcpy(pdata.companyName, "sdfsd");

    exit(0);
}

Поскольку после companyInfo нет *, pdata является не указателем на структуру, а структурой.

0 голосов
/ 09 марта 2012

Проблема не в использовании структуры, а в попытке использовать нулевой указатель. Попробуйте что-то вроде этого:

struct companyInfo *pdata = malloc(sizeof(*pdata));

strcpy(pdata->name, "sdfsd");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...