Ошибка сегментации при генерации удваивается с помощью rand () в c - PullRequest
0 голосов
/ 28 апреля 2018

Согласно GDB эта строка вызывает ошибку сегментации

((double) rand()/(double) (RAND_MAX)) * (r*2)

но это совершенно нормально

((float) rand()/(float) (RAND_MAX)) * (r*2)

Я могу обходиться без поплавков, но это меня беспокоит. Я делаю что-то не так или rand() неспособен справиться с двойниками.

Обратите внимание, что в контексте верхнего примера все вхождения float были изменены на double.

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

struct cord {
    /* float or double */
    float x;
    float y;
};

int main() {
    float r = 3.0;
    int amount = 1000000;
    struct cord cords[amount];

    srand(time(NULL));
    for (int i = 0; i < amount; i++) {

        cords[i] = (struct cord) {
            /* Segfault occurs when (float) is replaced with (double) */
            ((float) rand()/(float) (RAND_MAX)) * (r*2),
            ((float) rand()/(float) (RAND_MAX)) * (r*2)
        };

    }
}

1 Ответ

0 голосов
/ 28 апреля 2018

В момент возникновения ошибки по умолчанию больше нет стекового пространства для выделения нового значения double. Расположение следующего двойника будет по недопустимому (за пределами) адресу памяти, следовательно, segfault.

Причина, по которой ваш код не выполняет segfault для float, заключается в том, что числа с плавающей запятой имеют одинарную точность и обычно требуют половину количества байтов (обычно 4B) для хранения по сравнению с двойным (обычно 8B) , В вашем коде все еще достаточно места для хранения всех чисел.

...