gpt4 book ai didi

c - 将双指针传递给函数作为引用 - c

转载 作者:行者123 更新时间:2023-11-30 19:22:25 25 4
gpt4 key购买 nike

我在尝试将双指针的引用传递给函数时遇到了困难。我有这个:

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

#define MAX_ROWS 2
#define MAX_COLS 2

int main(void){
int i=0,lenght=0,maxColumns=0,j=0,k=0,maxRows=0,maxColumns2=0;
int **columnVect;
/*lengthOfPtr gives me the columns that i need. */
if((lenght=(lengthOfPtr(ptrMessage)))<=3){
maxColumns=1;
maxColumns2=2;
}else{
maxColumns=lenght/2;
maxColumns2=maxColumns;
}
/* Allocating Memory for the double pointer. */
columnVect=malloc(maxColumns2 * sizeof(int*));
if(columnVect == NULL){
fprintf(stderr, "Memory error.\n");
exit(0);
}

for(i = 0; i < maxColumns2; i++){
columnVect[i] = malloc(maxRows * sizeof(int));
if(columnVect[i] == NULL){
fprintf(stderr, "Memory error.\n");
exit(0);
}
}

// Do something that fills columnVect[i][j]

/* Passing the double pointer to messageVector */
messageVector(&columnVect,maxColumns);
return 0;
}


int messageVector(int ***columnVect,int maxColumns){
/* Allocating Memory for the triple pointer. */
columnVect=(int ***)malloc(sizeof(int **));

//Do something here . . .

return messageVector;
}

如果我运行该程序会给我:(lldb)

在:

3开始libdyld.dylib`启动:0x7fff88b447e0:无

谁能告诉我如何以正确的方式做到这一点?谢谢!

最佳答案

好吧,虽然我不太明白你想用 messageVector 函数来完成什么,但我认为你的问题是合理的,因此我会尽力给你一些见解。

首先,您在 main 函数中提供的代码还存在另一个问题。如果在分配 maxColumns2 行时 malloc 失败,则退出时不会释放任何先前分配的行。

请注意,我特意交换了 maxColumns2maxRows 的措辞,因为在一般情况下它更有意义。从概念上讲,您首先分配 int 指针行,然后为每一行分配 int 列。

所以,你可以尝试这样的事情......

/* Allocating Memory for the double pointer. */

columnVect = malloc( maxRows * sizeof(int *) );
if ( columnVect == NULL ){
fputs( "Memory error.\n", stderr );
exit(0);
}

for (int i=0; i < maxRows; i++)
{
columnVect[i] = malloc( maxColumns2 * sizeof(int) );
if ( columnVect[i] == NULL )
{
fputs( "Memory error.\n", stderr );
for (int j = i-1; j > -1; j--)
free( columnVect[j] );
free( columnVect );
columnVect = NULL;
exit(0);
}
}

内部循环(使用j计数器)从最后一个成功分配的行走向第一行,并在途中释放它们。之后,columnsVect 也被free'ed(即,在外循环之前为 int 指针保留的内存)并被设置为NULL

我可能在这里吹毛求疵,因为大多数现代操作系统都会在程序终止后释放程序分配的所有内存,但始终释放已分配的内存是一个好习惯。一方面,它有助于调试代码。如果您需要将当前代码嵌入到更大的项目(例如库)中,它还可以防止您将来造成内存泄漏。

现在,关于将双指针的引用传递到函数中,一个很好且简单的示例恕我直言,它是一个函数,该函数释放为该指针保留的内存,并将指针设置为NULL 。大致如下:

void free_int2d( int ***int2d, int nrows )
{
int i;

if ( nrows < 1 ) {
printf( "*** warning: %s() failed, no memory freed\n", __func__ );
return;
}
if ( !int2d || !*int2d )
return;

for (i=0; i < nrows; i++) {
if ( (*int2d)[i] )
free( (*int2d)[i] );
}

*int2d = NULL;
}

希望它是不言自明的,但为了以防万一,让我指出一些事情。

主要的方法是每当您想在函数内表达原始双指针(即 int 指针的行)时,编写 *int2d

另外一个是,当你想表达第i行时,你写(*i​​nt2d)[i]。您必须将第一个取消引用显式括在括号内...第二个取消引用是通过 [ ] 符号隐式完成的。

最后,作为通过引用传递双指针到该函数的示例,这里是原始代码的内部循环,使用此 free_int2 函数重写...

for (int i=0; i < maxRows; i++)
{
columnVect[i] = malloc( maxColumns2 * sizeof(int) );
if ( columnVect[i] == NULL )
{
fputs( "Memory error.\n", stderr );
free_int2d( &columnVect, i );
exit(0);
}
}

它被大大简化,因此更具可读性。 free_2d( &columnVect, maxRows ) 也应该在程序成功终止时被调用(出于我上面解释的原因)。

编辑

出于性能原因,您可以考虑预先分配一个缓冲区来malloc列,并根据需要重新分配它(可能将其大小加倍)。但这会产生更复杂的代码。

关于c - 将双指针传递给函数作为引用 - c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16626002/

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