我有一個巨大的代碼,但為了測驗,我創建了以下的示例代碼
。#include <stdio.h>/span>
#include <stdlib.h>
#define POSSIBLE_HEIGHTS 10
#define POSSIBLE_LENGTHS 10
typedef struct amap {
int *va_height;
int *va_length;
} amap_t;
static amap_t *mymap[10] 。
int prepare_mymap(amap_t **)。
int main (int argc, char *argv[]) /span> {
prepare_mymap(&mymap[0] )。
short int cnt;
int max = 10;
for (cnt = 0; cnt < max; cnt){
if (mymap[cnt] != NULL){
if (mymap[cnt]->va_height == NULL){
printf ("Hights are not set for : %d
", cnt)。)
}
}
}
return 0;
}
int prepare_mymap (amap_t **arg_map){
short int i。
for (i =0; i < 10; i){
if (i % 2 == 0) {
int r = posix_memalign ((void **) &arg_map[i], 16,
(sizeof(int) * POSSIBLE_HEIGHTS))。
if (r != 0) {
printf ("memalign failed @ %d
", i)。)
} else {
printf ("mem allocated @ %d
", i)。)
}
}
}
return 0;
}
我想讓*mymap[10]變得動態。函式prepare_mymapp()將確定mymap中的元素數量;其中一些被分配,一些沒有。我的問題是,在不改變main中的訪問方法的情況下,是否有可能使static amap_t *mymap[10];動態?
我不想改變main(),因為它是一個巨大的代碼,使用指標和對NULL的檢查。
if (mymap[cnt] != NULL){
if (mymap[cnt]->va_height == NULL){
printf ("Hights are not set for : %d
", cnt)。)
}
}
如果我做了以下作業:
static amap_t *mymap。
prepare_mymap(&mymap)。
和
int prepare_mymap (amap_t **arg_map){
int arg_map_size = 10;
*arg_map = malloc (sizeof(amap_t *) * arg_map_size) 。
....
posix_memalign.....
}
然后,我的主要變化是這樣的。
我的主要變化是這樣的。
if (*mymap[cnt] != NULL){
if (mymap[cnt].va_height == NULL){
printf ("Hights are not set for : %d
", cnt)。)
}
}
有什么方法可以避免它嗎?***會幫助我嗎?
uj5u.com熱心網友回復:
一種使static amap_t* mymap[10]成為動態陣列的方法是這樣宣告的:
static amap_t** mymap。
據此,你的prepare_mymap()函式變成:
static amap_t** mymap。
int prepare_mymap(amap_t*** arg_map) {
size_t arg_map_size = 10;
*arg_map = malloc(arg_map_size * sizeof(amap_t *))。
...
}
int main(void) {
prepare_mymap(&mymap)。
...
}
另外,你的prepare_mymap()函式可以直接回傳指標(所以你不需要一個 "三星 "指標作為引數):
static amap_t** mymap。
amap_t** prepare_mymap(void) {
size_t arg_map_size = 10;
amap_t** result = malloc(arg_map_size * sizeof(amap_t*) 。)
...
return result。
}
int main(void) {
mymap = prepare_mymap()。
...
}
如果你愿意,你可以用posix_memalign()替換我前面例子中的malloc()。例如:
// this line of code.
*arg_map = malloc(arg_map_size * sizeof(amap_t*)) 。
//變成
void* temp;
int r = posix_memalign(&temp, alignment, arg_map_size * sizeof(amap_t*))。)
*arg_map = temp;
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/329584.html
標籤:
下一篇:run.bat的標題
