Objective c C语言中二维数组指针的解引用
我指向一个2D数组的地址,我不知道如何取消对指针的引用以再次释放内存。(我不使用“->”或“*”,错了吗?) 我的代码: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
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
的结果。