gpt4 book ai didi

C 将指针传递给指向函数的指针并使用 malloc

转载 作者:太空宇宙 更新时间:2023-11-04 03:31:49 25 4
gpt4 key购买 nike

我正在尝试获取标准输入以在 x 行 (x<100) 和 y 列 ( y<1,000,000)。但是 y 每行的长度都是可变的。

输入的第一行是x,表示每个数组中的行数。第二行是 y 第一行的列数。接下来是要读入 arrAtk 数组的 y 个整数。然后将另一个 y 整数读入 arrDef 数组。紧接着是一个 int y,表示接下来两行中的列数。等等。

并行数组将保存稍后排序的整数,并且将比较每个并行元素以查看哪一行的数字更大。

问题:所以我试图通过函数调用扫描输入并动态分配正确数量的内存并扫描二维数组的每一行的输入。这似乎工作正常但是当我尝试在 main 中打印数组值时它崩溃了。 printf 语句在 scanIn 函数中工作,所以我不能正确传递值。我怎样才能将它带到可以在函数外部使用动态创建的数组的位置?

提前致谢

标准输入示例:

2  //<- x num of rows 
2 //<- y num of cols
3
6
5
2
3 //<- y num of cols
2
3
12
9
3
4

代码:

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

int scanIn(int**,int**,int*);

int main(){
int cases, *armies, **arrAtk, **arrDef;

cases = scanIn(arrAtk,arrDef,armies);

printf("%d\n",arrAtk[1][2]); // Should be 12 with above input
printf("%d",arrDef[0][1]); // Should be 2

return 0;
}

int scanIn(int **arrAtk, int **arrDef, int *armies){
int i, j, cases;

scanf("%d",&cases);
arrAtk = (int**)malloc(sizeof(int*)*cases);
arrDef = (int**)malloc(sizeof(int*)*cases);
armies = (int*)malloc(sizeof(int)*cases);

for(i=0;i<cases;i++){
scanf("%d",&armies[i]);
arrAtk[i] = malloc(sizeof(int)*armies[i]);
arrDef[i] = malloc(sizeof(int)*armies[i]);

for(j=0;j<armies[i];j++){
scanf("%d",&arrAtk[i][j]);
}
for(j=0;j<armies[i];j++){
scanf("%d",&arrDef[i][j]);
}
}
return (cases);
}

最佳答案

虽然有更好的方法可以做到这一点,但可以使用您所采用的方法来完成。首先要注意的是,您将每个指针传递给您的函数,而不是指针的地址。发生这种情况时,您的函数会收到指针的副本,其中包含值的正确地址(如果已初始化),但具有非常不同的地址

因此,当您为函数中的每个数组分配存储空间时,main 中的指针完全没有变化。他们仍然没有指向任何东西。为了在 main 中反射(reflect)分配,您必须将指针的地址传递给您的函数,并相应地在您的函数中取消引用,以便分配在 主要

简短的版本是你需要用 scanIn (&arrAtk, &arrDef, &armies) 调用你的函数,你的原型(prototype)必须是 (int***, int***, int* *)。 (不是特别有吸引力)

另一个问题是 C 中的 style 通常避免使用 caMelCase 变量(留给 C++)。请参阅:(第 2.2 节)NASA C Style Guide (戈达德航天中心 1994)

下面是使分配按预期工作所需的附加间接级别的示例。 (注意:你还应该释放你分配的内存):

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

int scan_in (int***, int***, int**);

int main (void) {

int cases, *armies, **arr_atk, **arr_def;

cases = scan_in (&arr_atk, &arr_def, &armies);

printf ("\n cases : %d\n", cases);
printf (" arr_atk[1][2] : %d\n", arr_atk[1][2]);
printf (" arr_def[0][1] : %d\n\n", arr_def[0][1]);

return 0;
}

int scan_in (int ***arr_atk, int ***arr_def, int **armies)
{
int i, j, cases;

scanf ("%d",&cases);
*arr_atk = malloc (sizeof **arr_atk * cases);
*arr_def = malloc (sizeof **arr_def * cases);
*armies = malloc (sizeof *armies * cases);

for (i = 0; i < cases; i++) {
scanf ("%d", &(*armies)[i]);
(*arr_atk)[i] = malloc (sizeof ***arr_atk * (*armies)[i]);
(*arr_def)[i] = malloc (sizeof ***arr_def * (*armies)[i]);

for (j = 0; j < (*armies)[i]; j++) {
scanf ("%d", &(*arr_atk)[i][j]);
}
for (j = 0; j < (*armies)[i]; j++) {
scanf ("%d", &(*arr_def)[i][j]);
}
}
return (cases);
}

输入

$ cat ../dat/2dscan.txt
2
2
3
6
5
2
3
2
3
12
9
3
4

输出

$ ./bin/2dscanin < ../dat/2dscan.txt

cases : 2
arr_atk[1][2] : 12
arr_def[0][1] : 2

注意:因为您是 C 语言的新手,所以还有一些地方可以改进您的代码:(1) 总是初始化您的未显式变量在您的代码中分配一个值; (2) 始终验证您调用的函数的返回值; (3) 始终跟踪并释放 您分配的不再需要的内存。考虑到这一点,您的 mainscan_in 代码将如下所示:

int main (void) {

int i, cases = 0, *armies = NULL, **arr_atk = {NULL}, **arr_def = {NULL};

if ((cases = scan_in (&arr_atk, &arr_def, &armies)) < 1) {
fprintf (stderr, "error: invalid value for cases returned.\n");
return 1;
}

printf ("\n cases : %d\n", cases);
printf (" arr_atk[1][2] : %d\n", arr_atk[1][2]);
printf (" arr_def[0][1] : %d\n\n", arr_def[0][1]);

for (i = 0; i < cases; i++) { /* free allocated memory */
if (arr_atk[i]) free (arr_atk[i]);
if (arr_def[i]) free (arr_def[i]);
}
if (arr_atk) free (arr_atk);
if (arr_def) free (arr_def);
if (armies) free (armies);

return 0;
}

int scan_in (int ***arr_atk, int ***arr_def, int **armies)
{
int i, j, cases;

if (scanf ("%d",&cases) != 1) {
fprintf (stderr, "scan_in() error: input failure.\n");
return 0;
}
*arr_atk = malloc (sizeof **arr_atk * cases);
*arr_def = malloc (sizeof **arr_def * cases);
*armies = malloc (sizeof *armies * cases);

for (i = 0; i < cases; i++) {
if (scanf ("%d", &(*armies)[i]) != 1) {
fprintf (stderr, "scan_in() error: input failure.\n");
return 0;
}
(*arr_atk)[i] = malloc (sizeof ***arr_atk * (*armies)[i]);
(*arr_def)[i] = malloc (sizeof ***arr_def * (*armies)[i]);

for (j = 0; j < (*armies)[i]; j++) {
if (scanf ("%d", &(*arr_atk)[i][j]) != 1) {
fprintf (stderr, "scan_in() error: input failure.\n");
return 0;
}
}
for (j = 0; j < (*armies)[i]; j++) {
if (scanf ("%d", &(*arr_def)[i][j]) != 1) {
fprintf (stderr, "scan_in() error: input failure.\n");
return 0;
}
}
}
return (cases);
}

关于C 将指针传递给指向函数的指针并使用 malloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35853776/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com