Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c C语言中二维数组指针的解引用_Objective C_C_Pointers_Reference - Fatal编程技术网

Objective c C语言中二维数组指针的解引用

Objective c C语言中二维数组指针的解引用,objective-c,c,pointers,reference,Objective C,C,Pointers,Reference,我指向一个2D数组的地址,我不知道如何取消对指针的引用以再次释放内存。(我不使用“->”或“*”,错了吗?) 我的代码: double array[12][12]; //filled with numbers double *arrayPtr; //pointer arrayPtr = &array[0][0]; //pointing to address multiply(arrayPtr, arrayPtr); //this works fine //Do I need to

我指向一个2D数组的地址,我不知道如何取消对指针的引用以再次释放内存。(我不使用“->”或“*”,错了吗?)

我的代码:

double array[12][12];
//filled with numbers

double *arrayPtr; //pointer

arrayPtr = &array[0][0]; //pointing to address

multiply(arrayPtr, arrayPtr); //this works fine

//Do I need to do anything further to make sure my memory management is correct?  And if so, why?

在这种情况下,答案是否定的——因为您只定义了
数组
(没有使用类似
malloc
的方法来分配它),所以您也不必做任何事情来释放它。如果它是本地的(在函数中定义),则在退出函数时会自动释放它。如果您在任何函数之外定义它,那么它是一个全局函数,因此它将在程序运行的整个过程中都存在。无论哪种方式,您都不必进行任何显式内存管理。

在这种情况下,答案是否定的——因为您只是定义了
数组(没有使用类似
malloc
的方法来分配它),您也不必做任何事情来释放它。如果它是本地的(在函数中定义),则在退出函数时会自动释放它。如果您在任何函数之外定义它,那么它是一个全局函数,因此它将在程序运行的整个过程中都存在。无论哪种方式,您都不必进行任何显式内存管理

double array[12][12];
您正在堆栈上声明
array
。它不是与堆一起动态分配的,因此您不会“释放内存”

如果要指向第一个元素,这就足够了:

double* arrayPtr = array;
您正在堆栈上声明
array
。它不是与堆一起动态分配的,因此您不会“释放内存”

如果要指向第一个元素,这就足够了:

double* arrayPtr = array;

首先,C和C之间有很大的不同++

在C语言中,要使用内存管理,应使用malloc/calloc/realloc和free。在C++中,你将使用新的和删除。 在你的代码中

double array[12][12];
这意味着在堆栈中分配内存。因此,内存将分配给这个程序段的作用域,这样当这个变量的作用域结束时,它将是绿色的

如果你想免费使用,你需要

 double **array;
 array = (double **) malloc(sizeof(double*));
 *array = (double*) malloc (24 * sizeof(double));

free (*array);
free (array);

首先,C和C之间有很大的不同++

在C语言中,要使用内存管理,应使用malloc/calloc/realloc和free。在C++中,你将使用新的和删除。 在你的代码中

double array[12][12];
这意味着在堆栈中分配内存。因此,内存将分配给这个程序段的作用域,这样当这个变量的作用域结束时,它将是绿色的

如果你想免费使用,你需要

 double **array;
 array = (double **) malloc(sizeof(double*));
 *array = (double*) malloc (24 * sizeof(double));

free (*array);
free (array);

非常感谢。易于理解并回答了我的问题:我必须再等几分钟才能接受,但我会确保其他人也能看到这个解决方案。非常感谢。易于理解并回答了我的问题:我必须再等几分钟才能接受,但我会确保其他人也能看到此解决方案此代码有很多错误。。。也就是说,强制转换不仅是错误的,而且是不必要的,在这种情况下是非法的(很抱歉,您不能将指针类型强制转换为浮动类型)。另外,
free
部分的语法错误。。。
()
不见了。对不起,我不明白你的评论,当你使用指针时,用C语言表示;S对C++的限制较小,允许使用()铸造。此外,强制转换意味着将此内存部分解释为您正在执行的类型强制转换。我知道什么是强制转换,关键是你不需要强制转换malloc的结果。在C中,
void*
可以隐式转换为任何其他指针类型,而无需强制转换。查看为什么不应强制转换
malloc
的结果。此代码有很多错误。。。也就是说,强制转换不仅是错误的,而且是不必要的,在这种情况下是非法的(很抱歉,您不能将指针类型强制转换为浮动类型)。另外,
free
部分的语法错误。。。
()
不见了。对不起,我不明白你的评论,当你使用指针时,用C语言表示;S对C++的限制较小,允许使用()铸造。此外,强制转换意味着将此内存部分解释为您正在执行的类型强制转换。我知道什么是强制转换,关键是你不需要强制转换malloc的结果。在C中,
void*
可以隐式转换为任何其他指针类型,而无需强制转换。请参阅关于为什么不应强制转换
malloc
的结果。