在main之外定义的函数内的main中分配数组
Allocate array in main inside a function which is defined outside of main
我正在尝试在函数内的数组上使用 calloc,但它不起作用。尝试调试时,我发现函数内部的指针指向分配的内存,但当离开函数时,它再次指向 NULL。尝试了各种变体,但似乎无法找到解决方案。
这是我的代码:
int main(int argc, char *argv[]) {
int *rows = NULL, *solvedRows = NULL;
int **board = NULL, **solvedBoard = NULL;
allocateMemory(dim, &(*rows), &(*board));
allocateMemory(dim, &(*solvedRows), &(*solvedBoard));
}
void allocateMemory(int dim, int** rows, int*** board) {
rows = calloc(dim*dim,sizeof(int));
board = calloc(dim, sizeof(int*));
if (rows == NULL || board == NULL) {
printf("Error: calloc has failed\n");
exit(1);
}
}
需要帮助以了解问题所在以及解决方法。
编辑
我试过了:
*rows = calloc(dim*dim,sizeof(int));
*board = calloc(dim, sizeof(int*));
仍然有同样的问题。
也尝试过:
allocateMemory(dim, &rows, &board);
for line 4 and (5 same) and in doesn't compile with the error:
“错误:从不兼容的指针类型 [-Werror=incompatible-pointer-types] 传递 'allocateMemory' 的参数 2
分配内存(暗淡,&行,&板);
^"
错误:从不兼容的指针类型 [-Werror=incompatible-pointer-types] 传递 'allocateMemory' 的参数 3
分配内存(暗淡,&行,&板);
^
编辑
对于遇到此问题并查看此页面的任何人,最后一次尝试实际上是正确的,正如迈克尔在下面回答的那样。错误是对应头文件的错误,在修复头文件的时候修复了。
让我们关注您的 rows
变量:
rows
是指针,是一个保存内存地址的变量。
现在您希望 alocateMemory 写入 rows
内存块的地址,以保存您的数据。足够简单:
size_d dim = 10;
int* rows = 0;
rows = calloc(1, sizeof(int) * dim);
但是,如果您将此代码放入函数中,例如
void allocateMemory(size_t dim, int* rows) {
rows = calloc(1, sizeof(int) * dim);
}
现在如果你像这样调用这个函数
int* actualRows = 0;
allocateMemory(3, actualRows);
actualRows
(即0
)的值将被复制到一个新的变量rows
中,您在[=24]中操作=].当你写入行时,它的值会改变,但是当allocateMemory
被留下时,rows
就会被销毁。 actualRows
永远不会改变。
你想要的是 allocateMemory
设置 actualRows
o 内存地址的值。为此,您必须向 allocateMemory
提供 actualRows
的 地址 ,例如
allocateMemory(3, &actualRows);
&atualRows
是actualRows
的内存地址,它的类型是int**
(指向int
的指针)。
现在您必须适当调整 allocateMemory
的签名:
void allocateMemory(size_t dim, int** rows) {
rows = calloc(1, sizeof(int) * dim);
}
并且,由于 rows 现在是一个指针并且您想更改其目标,因此您需要在分配之前取消引用它:
*rows = calloc(1, sizeof(int) * dim);
总产量:
void allocateMemory(size_t dim, int** rows) {
*rows = calloc(1, sizeof(int) * dim);
}
...
int* actualRows = 0;
allocateMemory(3, &actualRows);
...
你的board
,原则上是一样的。尝试
#include <stdio.h>
#include <stdlib.h>
void allocateMemory(int dim, int** rows, int*** board) {
*rows = calloc(dim * dim,sizeof(int));
*board = calloc(dim, dim * sizeof(int*));
if (rows == NULL || board == NULL) {
printf("Error: calloc has failed\n");
}
for(size_t i = 0; i < dim; ++i) {
(*board)[i] = calloc(1, sizeof(int) * dim);
if ((*board)[i] == NULL) {
printf("Error: calloc has failed\n");
}
}
}
int main(int argc, char *argv[]) {
size_t dim = 10;
int *rows = NULL;
int **board = NULL;
allocateMemory(dim, &rows, &board);
rows[0] = 10;
rows[1] = 11;
for(size_t i = 0; i < dim; ++i) {
printf("%i ", rows[i]);
}
printf("\n\n\n");
board[0][0] = 11;
board[9][0] = 99;
board[9][9] = 101;
for(size_t i = 0; i < dim; ++i) {
for(size_t k = 0; k < dim; ++k) {
printf("%i ", board[i][k]);
}
printf("\n");
}
printf("\n");
for(size_t i = 0; i < dim; ++i) free(board[i]);
free(board);
free(rows);
}
我正在尝试在函数内的数组上使用 calloc,但它不起作用。尝试调试时,我发现函数内部的指针指向分配的内存,但当离开函数时,它再次指向 NULL。尝试了各种变体,但似乎无法找到解决方案。
这是我的代码:
int main(int argc, char *argv[]) {
int *rows = NULL, *solvedRows = NULL;
int **board = NULL, **solvedBoard = NULL;
allocateMemory(dim, &(*rows), &(*board));
allocateMemory(dim, &(*solvedRows), &(*solvedBoard));
}
void allocateMemory(int dim, int** rows, int*** board) {
rows = calloc(dim*dim,sizeof(int));
board = calloc(dim, sizeof(int*));
if (rows == NULL || board == NULL) {
printf("Error: calloc has failed\n");
exit(1);
}
}
需要帮助以了解问题所在以及解决方法。
编辑
我试过了:
*rows = calloc(dim*dim,sizeof(int));
*board = calloc(dim, sizeof(int*));
仍然有同样的问题。
也尝试过:
allocateMemory(dim, &rows, &board);
for line 4 and (5 same) and in doesn't compile with the error: “错误:从不兼容的指针类型 [-Werror=incompatible-pointer-types] 传递 'allocateMemory' 的参数 2 分配内存(暗淡,&行,&板); ^" 错误:从不兼容的指针类型 [-Werror=incompatible-pointer-types] 传递 'allocateMemory' 的参数 3 分配内存(暗淡,&行,&板); ^
编辑
对于遇到此问题并查看此页面的任何人,最后一次尝试实际上是正确的,正如迈克尔在下面回答的那样。错误是对应头文件的错误,在修复头文件的时候修复了。
让我们关注您的 rows
变量:
rows
是指针,是一个保存内存地址的变量。
现在您希望 alocateMemory 写入 rows
内存块的地址,以保存您的数据。足够简单:
size_d dim = 10;
int* rows = 0;
rows = calloc(1, sizeof(int) * dim);
但是,如果您将此代码放入函数中,例如
void allocateMemory(size_t dim, int* rows) {
rows = calloc(1, sizeof(int) * dim);
}
现在如果你像这样调用这个函数
int* actualRows = 0;
allocateMemory(3, actualRows);
actualRows
(即0
)的值将被复制到一个新的变量rows
中,您在[=24]中操作=].当你写入行时,它的值会改变,但是当allocateMemory
被留下时,rows
就会被销毁。 actualRows
永远不会改变。
你想要的是 allocateMemory
设置 actualRows
o 内存地址的值。为此,您必须向 allocateMemory
提供 actualRows
的 地址 ,例如
allocateMemory(3, &actualRows);
&atualRows
是actualRows
的内存地址,它的类型是int**
(指向int
的指针)。
现在您必须适当调整 allocateMemory
的签名:
void allocateMemory(size_t dim, int** rows) {
rows = calloc(1, sizeof(int) * dim);
}
并且,由于 rows 现在是一个指针并且您想更改其目标,因此您需要在分配之前取消引用它:
*rows = calloc(1, sizeof(int) * dim);
总产量:
void allocateMemory(size_t dim, int** rows) {
*rows = calloc(1, sizeof(int) * dim);
}
...
int* actualRows = 0;
allocateMemory(3, &actualRows);
...
你的board
,原则上是一样的。尝试
#include <stdio.h>
#include <stdlib.h>
void allocateMemory(int dim, int** rows, int*** board) {
*rows = calloc(dim * dim,sizeof(int));
*board = calloc(dim, dim * sizeof(int*));
if (rows == NULL || board == NULL) {
printf("Error: calloc has failed\n");
}
for(size_t i = 0; i < dim; ++i) {
(*board)[i] = calloc(1, sizeof(int) * dim);
if ((*board)[i] == NULL) {
printf("Error: calloc has failed\n");
}
}
}
int main(int argc, char *argv[]) {
size_t dim = 10;
int *rows = NULL;
int **board = NULL;
allocateMemory(dim, &rows, &board);
rows[0] = 10;
rows[1] = 11;
for(size_t i = 0; i < dim; ++i) {
printf("%i ", rows[i]);
}
printf("\n\n\n");
board[0][0] = 11;
board[9][0] = 99;
board[9][9] = 101;
for(size_t i = 0; i < dim; ++i) {
for(size_t k = 0; k < dim; ++k) {
printf("%i ", board[i][k]);
}
printf("\n");
}
printf("\n");
for(size_t i = 0; i < dim; ++i) free(board[i]);
free(board);
free(rows);
}