Передача пустого массива в функцию - не работает - PullRequest
2 голосов
/ 19 июня 2019

Я довольно новичок в C и пытаюсь сделать то, что, как мне кажется, очень просто - но я застреваю по какой-то причине:

У меня есть main в файле с именем runnable.c, гдеУ меня есть:

#include <stdio.h>
#include <windows.h>
#include "utils.h"
#define N 100000
#define num_vars 1

int main() {
    printf("I am running...\n");
    double values[N*num_vars];
    double ders[N*num_vars];
    char variable[] = "params.txt"; 
    read_file_to_array(variable, values); // fills up values 
    test_values(values);
    test_num_points(N);
    test_ders(ders);
    return 0;
}

У меня есть utils.h, который определяет

void test_values(double values[]);
void test_ders(double ders[]);
void test_num_points(int num_points);

И utils.c, который имеет

#include <stdio.h>
void test_values(double values[]) {
    printf("I am in test_values\n");
}

void test_num_points(int num_points) {
    printf("I am in test_num_points\n");
}

void test_ders(double ders[]) {
    printf("I am in test_ders\n");
}

Я собираю на моемWindows-машина, использующая

cl runnable.c utils.c /link /out:program.exe

Все прекрасно работает, когда у меня просто есть test_values и test_num_points - но по какой-то причине она не работает успешно, когда я добавляю test_ders в микс.Он по-прежнему правильно компилируется, но ничего не считается.

У меня проблемы с тем, чтобы отладчик работал на моей машине с Windows, и надеялся, что кто-нибудь сможет помочь мне разобраться в том, что происходит.

1 Ответ

3 голосов
/ 19 июня 2019

Размеры стека обычно довольно малы, т.е. всего несколько мегабайт.Поэтому вы должны быть осторожны при объявлении массивов как локальных переменных.

double ders[N*num_vars]; преобразуется в double ders[100000*1]; и будет использовать 800 Кбайт (при условии, что double равно 8 байтам).Так что это немного велико для локальной переменной.

Вы можете объявить с ним ключевое слово static или переместить его из main (то есть сделать его глобальной переменной).static и глобальные переменные могут использовать всю память, поэтому они могут быть намного больше, чем локальные переменные.Вы также можете выделить память динамически, например, используя malloc или calloc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...