LINUX.ORG.RU

struct ** Основы C работа с указателями


0

1

Сделал структуру


typedef struct{
        int col;
        int r_begin;
        int r_end;
}parm;
И мне надо целый массив этих структур. Думал сделать так

  parm *p[13];
        for (i=0;i<10;i++){
                p[i]->col = i;
                p[i]->r_begin = rand()%5;
                p[i]->r_end = rand()%30;
        } 

- ОШИБКА СЕГМЕНТИРОВАНИЯ. Думал так

parm **p = new parm*(10);
компилятор ругаеться alex@alex-Lenovo-B570 ~/Proj/Cpp $ ./build_and_run.sh first.cpp: В функции «void engine()»: first.cpp:71:25: ошибка: некорректное преобразование из «int» в «parm*» [-fpermissive]


parm p[13]

parm *p[13] - это массив указателей. parm **p - указатель на указатель на структуру.

note173 ★★★★★
()

А память кто выделять будет?

  parm *p[13];
Создает массив указателей, но память под сами структуры еще не выделена.
for (i=0;i<10;i++){
                p = malloc(sizeof(parm));
                p[i]->col = i;
                p[i]->r_begin = rand()%5;
                p[i]->r_end = rand()%30;
        }

hippi90 ★★★★★
()
Ответ на: комментарий от note173

Или, если очень надо именно так, то:

  parm *p[13];
        for (i=0;i<10;i++){
                p[i] = new parm; // malloc(sizeof(parm));
                p[i]->col = i;
                p[i]->r_begin = rand()%5;
                p[i]->r_end = rand()%30;
        } 

note173 ★★★★★
()

Во-первых, это C++;

Во-вторых,

parm **p = new parm*[10];

А в-третьих, не поленитесь, изучите уж выделение памяти как следует, это, пожалуй, причина 95% сегфолтов.

squareroot ★★★★
()
  parm p[13];
        for (i=0;i<10;i++){
                p[i].col = i;
                p[i].r_begin = rand()%5;
                p[i].r_end = rand()%30;
        } 
backbone ★★★★★
()
Ответ на: комментарий от vsrmis

Нужен именно указатель param*P

Переменные объявленные как T *v1 и T v2[n] это более менее одно и то же.

А так:

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

struct parm {
    int col;
    int r_begin;
    int r_end;
};

int main()
{
    // man malloc!
    struct parm *p = malloc(10 * sizeof(struct parm));

    for (int i = 0; i < 10; i++) {
        p[i].col = i;
        p[i].r_begin = rand() % 5;
        p[i].r_end = rand() % 30;
    }

    // ...

    for (int i = 0; i < 10; i++) {
        printf("p[%i] = {%i, %i, %i}\n", i, p[i].col, p[i].r_begin, p[i].r_end);
    }

    // ...

    free(p);

    return 0;
}
$ gcc -std=c99 -Wall -o rtfm rtfm.c
$ ./rtfm
p[0] = {0, 3, 16}
p[1] = {1, 2, 25}
p[2] = {2, 3, 25}
p[3] = {3, 1, 12}
p[4] = {4, 4, 1}
p[5] = {5, 2, 7}
p[6] = {6, 0, 19}
p[7] = {7, 3, 16}
p[8] = {8, 0, 6}
p[9] = {9, 2, 16}
$
quasimoto ★★★★
()
Ответ на: комментарий от squareroot

Это не С++, а 3.1415здец++.

В C++ будет так:

struct parm {
        int col;
        int r_begin;
        int r_end;
};

vector < parm > p(10);
for (i=0;i<10;i++){
        p[i].col = i;
        p[i].r_begin = rand()%5;
        p[i].r_end = rand()%30;
}

В C будет так:

typedef struct {
        int col;
        int r_begin;
        int r_end;
} parm;

parm p[10];
for (i=0;i<10;i++){
        p[i].col = i;
        p[i].r_begin = rand()%5;
        p[i].r_end = rand()%30;
}

Reset ★★★★★
()
Ответ на: комментарий от anonymous

Ну и? Тебя же не удивляет то, что для приготовления яичницы надо разбить яйца.

Reset ★★★★★
()

казалось бы, причем тут си?

grouzen ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.