[英]c pointers and arrays, copying contents into another array
我知道这可能是一个基本问题,但我从来没有完全掌握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做的任何改变都不会影响a中的值?
在你的'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;
}
刚分配的指针指b
指向相同的内存块作为a
和你只是分配“的内存b
”已泄漏。 它被分配但你不能再释放它了。
要复制您需要的数组,请复制它。
简单的方法是查找各种memcpy
方法,或者只是更长的方式
for (int i = 0; i < 4; i++) {
b[i] = a[i];
}
你需要知道“浅拷贝”和“深拷贝” - 因为你有一个int*
数组,我上面提到的是浅拷贝。 如果你需要复制每个int*
指向的内容,你将需要一些更复杂的东西。
您指向a
和b
两个存储器的不同块,然后分配b
到块指向a
,引起了内存泄漏。
既然你没有从函数p()
返回任何东西,你可以在堆栈上分配b
(我不知道你在做什么)。
如果您打算复制这些指针指向的数据,您可以像其他人建议的那样使用memcpy
或逐个元素复制。
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
}
这应该工作!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.