2009-05-21 5 views
0

Я прочитал пример на «Passing multi-dimensional arrays in C» на этом сайте.Передача динамически распределенных целых массивов в C

Это отличный пример использования массивов символов, и я многому научился у него. Я хотел бы сделать то же самое, создав функцию для обработки динамически распределенного одномерного целочисленного массива, а затем создаст еще одну функцию для обработки многомерного целочисленного массива. Я знаю, как это сделать как возвращаемое значение функции. Но в этом приложении мне нужно сделать это в списке аргументов функции.

Как и в приведенном выше примере, я хотел бы передать указатель на целочисленный массив функции, а также количество элементов «num» (или «row» и «col» для 2D-массива функция и т. д.). Я получил переработанную версию другого примера здесь, но я не могу заставить это работать, попробуйте, как я могу (строки кода, которые являются новыми или изменены из этого примера, отмечены). Кто-нибудь знает, как это решить?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define ELEMENTS 5 
void make(char **array, int **arrayInt, int *array_size) { 
    int i; 
    char *t = "Hello, World!"; 
    int s = 10; // new 
    array = malloc(ELEMENTS * sizeof(char *)); 
    *arrayInt = malloc(ELEMENTS * sizeof(int *)); // new 
    for (i = 0; i < ELEMENTS; ++i) { 
     array[i] = malloc(strlen(t) + 1 * sizeof(char)); 
     array[i] = StrDup(t); 
     arrayInt[i] = malloc(sizeof(int)); // new 
     *arrayInt[i] = i * s; // new 
    } 
} 
int main(int argc, char **argv) { 
    char **array; 
    int *arrayInt1D; // new 
    int size; 
    int i; 
    make(array, &arrayInt1D, &size); // mod 
    for (i = 0; i < size; ++i) { 
     printf("%s and %d\n", array[i], arrayInt1D[i]); // mod 
    } 
    return 0; 
} 
+0

Возможно, вам не следует начинать с нерабочего примера из вопроса, а скорее из рабочего ответа. – sth

ответ

1

В этом коде есть довольно много проблем. Посмотрите на следующее:

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

#define ELEMENTS 5 

/* 
* A string is an array of characters, say char c[]. Since we will be creating 
* an array of those, that becomes char *(c[]). And since we want to store the 
* memory we allocate somewhere, we must be given a pointer. Hence char 
* **(c[]). 
* 
* An int doesn't require a complete array, just int i. An array of those is 
* int i[]. A pointer to those is then int *(i[]). 
*/ 
void 
make(char **(chars[]), int *(ints[]), size_t len) 
{ 
    static char hw[] = "Hello, World!"; 
    size_t i = 0; 

    /* 
    * Allocate the memory required to store the addresses of len char arrays. 
    * And allocate the memory required to store len ints. 
    */ 
    *chars = malloc(len * sizeof(char *)); 
    *ints = malloc(len * sizeof(int)); 

    /* Fill each element in the array... */ 
    for (i = 0; i < ELEMENTS; i++) { 
     /* ... with a *new copy* of "Hello world". strdup calls malloc under 
     * the hood! */ 
     (*chars)[i] = strdup(hw); 
     /* ...with a multiple of 10. */ 
     (*ints)[i] = i * 10; 
    } 
} 

int 
main(void) 
{ 
    /* A string c is a character array, hence char c[] or equivalently char *c. 
    * We want an array of those, hence char **c. */ 
    char **chars = NULL; 
    /* An array of ints. */ 
    int *ints = NULL; 
    size_t i = 0; 

    /* Pass *the addresses* of the chars and ints arrays, so that they can be 
    * initialized. */ 
    make(&chars, &ints, ELEMENTS); 
    for (i = 0; i < ELEMENTS; ++i) { 
     printf("%s and %d\n", chars[i], ints[i]); 
     /* Don't forget to free the memory allocated by strdup. */ 
     free(chars[i]); 
    } 

    /* Free the arrays themselves. */ 
    free(ints); 
    free(chars); 

    return EXIT_SUCCESS; 
} 
+0

Это замечательно! Именно то, что я пытался сделать. Спасибо. В моем отладчике LabWindows/CVI во время выполнения он жалуется на нефатальную ошибку в «free (chars [i]); строка кода, с сообщением: «Попытка освободить указатель на память, не выделенную malloc() или calloc(). – 2009-05-21 19:43:19

+0

Интересно. Хорошо Valgrind жалуется, если я не освобождаю его. – Stephan202

+0

Спасибо за обширные комментарии, которые вы только что добавили. Я просто понял, что я сейчас делаю неправильно. Кроме того, я просто посмотрел на сайт Valgrind. Впечатляющий! Это само по себе стоило столько же, сколько ваш ответ ... – 2009-05-21 19:55:43

0

Вы отсутствующий размер строки здесь:


arrayInt[i] = malloc(sizeof(int)); // new 

должно быть что-то вроде:

где раньше вы использовали длину заданной строки как размер строки (также strlen(t)+1 должно быть в скобках, хотя эффект тот же, поскольку sizeof(char) является 1)

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