[英]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.