- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在尝试将双指针的引用传递给函数时遇到了困难。我有这个:
#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
失败,则退出时不会释放
任何先前分配的行。
请注意,我特意交换了 maxColumns2
和 maxRows
的措辞,因为在一般情况下它更有意义。从概念上讲,您首先分配 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
行时,你写(*int2d)[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/
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: template pass by value or const reference or…? 以下对于将函数
我用相同的参数列表重载了一个运算符两次。但返回类型不同: T& operator()(par_list){blablabla} const T& operator()(par_list){bla
假设我有实现接口(interface) I 的 Activity A。我的 ViewModel 类 (VM) 持有对实现接口(interface) I 的对象的引用: class A extends
PHP 如何解释 &$this ?为什么允许? 我遇到了以下问题,这看起来像是 PHP 7.1 和 7.2 中的错误。它与 &$this 引用和跨命名空间调用以及 call_user_func_arr
谁能解释一下下面“&”的作用: class TEST { } $abc =& new TEST(); 我知道这是引用。但是有人可以说明我为什么以及什么时候需要这样的东西吗?或者给我指向一个对此有很好解
引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。 C++ 引用 vs 指针 引用很容易与指针混淆,它们之间有三
目录 引言 背景 结论 引言 我选择写C++中的引用是因为我感觉大多数人误解了引用。而我之所以有这个感受是因为我主持过很多C++的面试,并且我很少
Perl 中的引用是指一个标量类型可以指向变量、数组、哈希表(也叫关联数组)甚至函数,可以应用在程序的任何地方 创建引用 定义变量的时候,在变量名前面加个 \,就得到了这个变量的一个引用 $sc
我编写了一个将从主脚本加载的 Perl 模块。该模块使用在主脚本中定义的子程序(我不是维护者)。 对于主脚本中的一个子例程,需要扩展,但我不想修补主脚本。相反,我想覆盖我的模块中的函数并保存对原始子例
我花了几个小时试图掌握 F# Quotations,但我遇到了一些障碍。我的要求是从可区分的联合类型中取出简单的函数(只是整数、+、-、/、*)并生成一个表达式树,最终将用于生成 C 代码。我知道使用
很多时候,问题(尤其是那些标记为 regex 的问题)询问验证密码的方法。似乎用户通常会寻求密码验证方法,包括确保密码包含特定字符、匹配特定模式和/或遵守最少字符数。这篇文章旨在帮助用户找到合适的密码
我想通过 MIN 函数内的地址(例如,C800)引用包含文本的最后一个单元格。你能帮忙吗? Sub Set_Formula() ' ----------------------------- Dim
使用常规的 for 循环,我可以做类似的事情: for (let i = 0; i < objects.length; i++) { delete objects[i]; } 常规的 for-
在 Cucumber 中,您定义了定义 BDD 语法的步骤;例如,您的测试可能有: When I navigate to step 3 然后你可以定义一个步骤: When /^I navigate t
这是什么UnaryExpression的目的,以及应该怎样使用? 最佳答案 它需要一个 Expression对象并用另一个 Expression 包裹它.例如,如果您有一个用于 lambda 的表达式
给出以下内容 $("#identifier div:first, #idetifier2").fadeOut(300,function() { // I need to reference jus
我不知道我要找的东西的正确术语,但我要找的是一个完整的引用,可以放在双引号之间的语句,比如 *, node()、@* 以及所有列出的 here加上任何其他存在的。 我链接到的答案提供了一些细节,但还
This question's answers are a community effort。编辑现有答案以改善此职位。它当前不接受新的答案或互动。 这是什么? 这是常见问答的集合。这也是一个社区Wi
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic
考虑下一个代码: fn get_ref(slice: &'a Vec, f: fn(&'a Vec) -> R) -> R where R: 'a, { f(slice) } fn m
我是一名优秀的程序员,十分优秀!