詳解C語言中sizeof如何在自定義函數(shù)中正常工作
1、在main函數(shù)中,sizeof是可以正常工作的,比如:
int main()
{
int n[5];
printf("input: \n");
int i ;
for(i = 0; i < 5; i++)
{
scanf("%d",n + i);
}
int len = sizeof(n)/sizeof(n[0]);
printf("%d\n",len);
return 0;
}2、但是在自定義函數(shù)中就不可以了,如下:
#include <stdio.h>
void print_1(int n[])
{
int i;
int len = sizeof(n)/sizeof(n[0]);
printf("len : %d\n",len);
for(i = 0; i < len; i++)
{
printf("%d",n[i]);
}
printf("\n");
}
int main()
{
int n[5];
printf("input: \n");
int i ;
for(i = 0; i < 5; i++)
{
scanf("%d",n + i);
}
print_1(n);
printf("\n");
return 0;
}3、至于原因以及解決方法感覺有篇博客說的比較好
原因在于:第一,在c中,數(shù)組在作為參數(shù)的時(shí)候就退化為指針,對(duì)一個(gè)地址來取大小呢,如果是32位系統(tǒng)的話即為4,如果是64位系統(tǒng)的話為8,所以呢,在函數(shù)中sizeof獲取的是指針的長(zhǎng)度而不是數(shù)組的長(zhǎng)度。第二呢,在函數(shù)中,sizeof的處理時(shí)間的在編譯期,也就是說對(duì)于動(dòng)態(tài)生成的數(shù)組大小是不能用sizeof來算出來的。
4、解決辦法
第一種辦法
把數(shù)組作為參數(shù)傳入到數(shù)組的同時(shí)呢,也傳入該數(shù)組的長(zhǎng)度進(jìn)去。不過該辦法需要在函數(shù)外獲取該數(shù)組的長(zhǎng)度才傳進(jìn)去,略顯麻煩。比如講上述代碼的打印函數(shù)的函數(shù)名print(int *n) ; 改成print(int *n ,int len);其中l(wèi)en代表數(shù)組n的長(zhǎng)度
第二種辦法
采用宏定義,但是這種方法個(gè)人感覺顯得有些啰嗦
第三種辦法
C++可以用vector等容器避免大部分?jǐn)?shù)組的操作,對(duì)于字符數(shù)組也有string可以替代,也有可以傳遞數(shù)組大小的奇跡淫巧。如果你需要計(jì)算數(shù)組長(zhǎng)度的函數(shù),可以使用宏定義 或者 如果是C++,也用相應(yīng)的模板技巧,這比宏定義安全。
template <size_t N>
long calc(long (&array)[N]) // 利用模板傳遞參數(shù) array是數(shù)組的引用
{
long res = 0L;
for (size_t i = 0;i < N;i ++) {
res += array[i];
}
return res;
}
int main()
{
long longarr[] = {1, 23, 4, 45, 46, 57,};
long sum = calc(longarr);
}總結(jié):在寫這些小的程序時(shí),若沒有特殊要求,直接將數(shù)組的長(zhǎng)度確定,就不需要這么麻煩了
到此這篇關(guān)于詳解C語言中sizeof如何在自定義函數(shù)中正常工作的文章就介紹到這了,更多相關(guān)C語言sizeof內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Qt中PaintEvent繪制實(shí)時(shí)波形圖的實(shí)現(xiàn)示例
本文主要介紹了Qt中PaintEvent繪制實(shí)時(shí)波形圖的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
C語言實(shí)現(xiàn)經(jīng)典24點(diǎn)算法
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)經(jīng)典24點(diǎn)算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10
C語言中字符串的內(nèi)存地址操作的相關(guān)函數(shù)簡(jiǎn)介
這篇文章主要介紹了C語言中字符串的內(nèi)存地址操作的相關(guān)函數(shù),包括bcopy()函數(shù)和bzero()函數(shù)以及bcmp()函數(shù),需要的朋友可以參考下2015-08-08
VC++?2019?"const?char*"類型的實(shí)參與"LPCTSTR"
這篇文章主要給大家介紹了關(guān)于VC++?2019?"const?char*"類型的實(shí)參與"LPCTSTR"類型的形參不兼容的解決方法,文中通過圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-03-03
C語言中的long型究竟占4個(gè)字節(jié)還是8個(gè)字節(jié)(遇到的坑)
小編在復(fù)習(xí)C語言的時(shí)候踩到了不少坑,糾結(jié)long類型究竟占4個(gè)字節(jié)還是8個(gè)字節(jié)呢?好,今天通過本文給大家分享下我的詳細(xì)思路,感興趣的朋友跟隨小編一起看看吧2021-11-11

