2017-01-18 12 views
0
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

int foo(char str[]) 
{ 
    char *str1=(char *)malloc(sizeof(char)*sizeof(str)); 

    printf("\n str %s size : %zu \n",str,sizeof(str));  
} 

int main() 
{ 
    char str[]="[email protected]#[email protected]#$abcd"; 
    printf("\n str %s size : %zu \n",str,sizeof(str)); 

    foo(str); 
    return 0; 
} 

なぜ文字列の長さがmain()foo()で異なるのですか?理由:同じstrfoo 8にmain とで長さ25を示している - これは、main通話strfooは単純なプログラムですか?文字列のサイズがメインと関数で異なるのはなぜですか?

出力:アレイタイプchar *のポインタに調整されているように、この関数宣言

int foo(char str[]); 

str [email protected]#[email protected]#$abcd size : 25 
str [email protected]#[email protected]#$abcd size : 8 
+1

この関数では、 'char str []'は 'char * str'と等価で、ポインタのサイズは再生している特定の文字列のサイズよりも小さくなります。 main関数では、 'str'は配列で、' sizeof'は配列のサイズを報告します。これは、 'sizeof(str)== strlen(str)+ 1'を意味する終端ヌルバイトを含みます。 ) '。 ( 'foo()'のメモリがリークすることに注意してください。) –

+0

が役に立ちます:http://www.c-faq.com/aryptr/index.html – yano

答えて

3

パラメータが宣言しました。

したがって、これらの関数宣言が

int foo(char str[1000]); 
int foo(char str[100]); 
int foo(char str[1]); 
int foo(char str[]); 

この式

sizeof(str) 

ポインタの大きさを与える関数内の結果と同じつの機能と

int foo(char *str); 

に相当する宣言タイプchar *です。

実際アレイ

char str[]="[email protected]#[email protected]#$abcd"; 

にこの表現

sizeof(str) 

が宣言されているメイン内

は、配列のサイズをもたらします。

演算子sizeofの代わりに配列に保持されている文字列を格納する関数にメモリを割り当てる場合は、標準文字列関数strlenを使用する必要があります。たとえば、

関連する問題