我知道这可能是一个基本问题,但我从来没有完全掌握C中的整个指针概念。
我的问题是,假设我有一个int数组,我把它传递给像这样的函数 `
int main(){
int *a = malloc(sizeof(int*)*4);
// add values to a
p(a);
}
void p(int *a){
int *b = malloc(sizeof(int*)*4)
b = a;
// change values in b
//print a b
}`
这样做的正确方法是什么,这样我对b做的任何改变都不会影响?中的值?
答案 0 :(得分:4)
在你的'p'方法中,你将指针b指定为指针a,或者换句话说,你指的是b指向指向的指针。对b的任何更改都会导致对a的更改,因为它们都会指向同一块内存。
使用memcpy复制内存块。它看起来像这样:
#include <string.h>
#include <stdlib.h>
void p(int *a){
int *b = (int*)malloc(sizeof(int)*4);
memcpy(b, a, sizeof(int)*4);
//make changes to b.
b[0] = 6;
b[1] = 7;
b[2] = 8;
b[3] = 9;
}
int main(int argc, char **argv)
{
int *a = (int*)malloc(sizeof(int)*4);
// add values to a
a[0] = 1;
a[1] = 2;
a[2] = 3;
a[3] = 4;
p(a);
return 0;
}
答案 1 :(得分:1)
仅指定指针意味着b
指向与a
相同的内存块和您刚刚分配的内存&#34;对于b
&#34;泄露了。它已经分配但你不能再免费了。
要复制你需要的数组,请复制它。
简单的方法是查找各种memcpy
方法,或者只是更长的方式
for (int i = 0; i < 4; i++) {
b[i] = a[i];
}
你需要知道&#34;浅拷贝&#34;和#34;深拷贝&#34; - 因为你有一个int*
的数组,我上面提到的是浅拷贝。如果您需要复制每个int*
指向的内容,您将需要更复杂的内容。
答案 2 :(得分:0)
您将a
和b
指向两个不同的内存块,然后将b
分配给a
指向的块,从而导致内存泄漏。
由于你没有从函数p()
返回任何内容,你可以在堆栈上分配b
(我不知道你在做什么)。
如果您打算复制这些指针所指向的数据,您可以使用memcpy
或按其他人的建议逐个元素复制。
答案 3 :(得分:0)
答案 4 :(得分:0)
void p(int *a){
int *b = malloc(sizeof(int*)*4)
int size=4;
while(size>=0){
b[size--]=a[size--];
}
// change values in b
//print a b
}
这应该有效!