問題描述:
獲取一個c語言數(shù)組A的指針P轧钓,在賦值的時候立即使用指針P,可以獲取A中的完整數(shù)據(jù)冒滩,但當在另一個函數(shù)中調(diào)用P時,無法獲取到A數(shù)組的完整數(shù)據(jù)浪谴,部分數(shù)據(jù)出現(xiàn)錯亂的現(xiàn)象开睡。
正確的指針賦值方式應當使用內(nèi)存拷貝因苹,先使用malloc函數(shù)開辟內(nèi)存空間,然后使用memcpy復制內(nèi)存內(nèi)容篇恒。
錯誤演示:
#import "ViewController.h"
#define kArraySize (12)
@implementation ViewController {
int *_arrayPointer;
}
- (void)viewDidLoad {
[super viewDidLoad];
[self setupArray];
// 稍后調(diào)用
[self printArray];
}
/**
配置數(shù)組
*/
- (void)setupArray {
int array[kArraySize] = {
11, 12, 13,
21, 22, 23,
31, 32, 33,
41, 42, 43,
};
// 直接給指針賦值
_arrayPointer = array;
// 立即調(diào)用
[self printArray];
}
/**
打印數(shù)組
*/
- (void)printArray {
for (int i=0; i<kArraySize; i++) {
printf("index-%d: %d \n", i, _arrayPointer[i]);
}
}
@end
輸出結果:
正確演示:將_arrayPointer = array;
替換成以下代碼
// // 直接給指針賦值
// _arrayPointer = array;
// 使用malloc和memcpy復制內(nèi)存
size_t memory_size = kArraySize * sizeof(int);
_arrayPointer = malloc(memory_size);
memcpy(_arrayPointer, array, memory_size);
源碼地址:https://github.com/SongJiaqiang/JQDemo/tree/master/CArrayMemoryLeaks