建議:
規則:**:
void clear(intarray)
}void dowork(void
)
clear()使用sizeof(array) / sizeof(array[0])這種用法確定這個陣列的元素數量,但由於array是乙個形參,因此它是指標型別,sizeof(array) = sizeof(int *) = 4 (32位os)
當sizeof操作符應用於宣告為陣列或函式型別的形參時,它產生經過調整的(指標)型別的長度
解決方案:
void clear(intarray, size_t len)
}void dowork(void
)
**:
enum ;int *table =null;
int insert_in_table(int pos, int
value)
if(pos >=tablesize)
table[pos] =value;
return0;
}
pos為int型別,可能為負數,導致在陣列所引用的記憶體邊界之外進行寫入
解決方案:
enum ;int *table =null;
int insert_in_table(size_t pos, int
value)
if(pos >=tablesize)
table[pos] =value;
return0;
}
當在同一檔案中時,void func(char *a); 和 void func(char a); 完全等價
但在函式原型之外,如果乙個陣列在乙個檔案中宣告為指標,在另乙個不同的檔案中宣告為陣列,它們是不等價的
**:
//main.c
#includeenum ;
char *a;
void insert_a(void
);int main(void
) insert_a();
return0;
}//insert_a.c
char
a;void insert_a(void
)
解決方案:
//insert_a.h
enum ;
extern
char *a;
void insert_a(void
);//
insert_a.c
#include "
insert_a.h
"char *a;
void insert_a(void
) //
main.c
#include#include
"insert_a.h
"int main(void
) insert_a();
return0;
}
**:
voidfunc(size_t s)
/*...
*/func(size);
/*...
*/
解決方案:
enum ;void
func(size_t s)
else}/*
...*/
func(size);
/*...
*/
**:
enum ;void func(const
intsrc, size_t len)
memcpy(dest, src,
sizeof(int) *len);
/*...
*/}
**:
enum ;intarr1[c][b];
int (*arr2)[a];
arr2 = arr1; //
不匹配 a != b
解決方案:
enum ;intarr1[c][b];
int (*arr2)[a];
arr2 = arr1; //
匹配 a == b
**:
structnumbers ;
int sum_numbers(const
struct numbers *numb)
return
total;
}int main(void
) ; sum_numbers(&my_numbers);
return0;
}
上面的**試圖用指標運算訪問結構的元素,這是危險的,因為結構中的字段並不保證在記憶體中是連續的
解決方案(使用陣列):
structnumbers ;
int sum_numbers(const
short *numb, size_t dim)
return
total;
}int main(void
) ; sum_numbers(my_numbers,
sizeof(my_numbers) / sizeof(my_numbers[0
]));
return0;
}
《c安全編碼標準》
C語言安全編碼陣列記法的一致性
對c語言程式來說,在同一檔案中時,void func char a 和 void func char a 完全等價 但在函式原型之外,如果乙個陣列在乙個檔案中宣告為指標,在另乙個不同的檔案中宣告為陣列,那麼它們是不等價的 示例 如下 解決方案如下 insert a.h enum extern cha...
D 實驗7 21 編碼 解碼陣列
設有乙個整型陣列a中存放n個互不相同的整數,a中元素取值範圍為0到n 1。a陣列的編碼定義如下 a 0 的編碼為0,放入b 0 ai的編碼為在a 0 a 1 a i 1 中比a i 的值小的數的個數,放入b i 例如 a 6 時,則b 6 你有兩個任務,任務一是編碼,即已知n與陣列a,求陣列b 任務...
F 實驗7 21 編碼 解碼陣列
設有乙個整型陣列a中存放n個互不相同的整數,a中元素取值範圍為0到n 1。a陣列的編碼定義如下 a 0 的編碼為0,放入b 0 ai的編碼為在a 0 a 1 a i 1 中比a i 的值小的數的個數,放入b i 例如 a 6 時,則b 6 你有兩個任務,任務一是編碼,即已知n與陣列a,求陣列b 任務...