无法在C中获得数组的大小

时间:2017-12-14 12:51:40

标签: c arrays sizeof

我正在做的练习要求创建一个包含50个字符的数组,将它放在一个结构中然后使用子程序在屏幕上打印数组并说明它有多少个字符(那里&#39) ;更多,但我遇到的问题是在这里)

这就是我做的事情

loadXML

`

但每次输入内容时,字符数最终都是1。 如果有人能向我解释我做错了什么会很好。

3 个答案:

答案 0 :(得分:2)

你错了,两个方面。

首先,函数调用

 x=Anzahl (&kette[50]);

错误(从语法上讲,从实际使用的角度来看),你需要传递主演地址,就像x=Anzahl (kette);

一样

其次,数组作为函数参数传递时,会延迟指向第一个元素的指针。因此,您无法使用sizeof从接收输入参数的参数中获取预期的大小

引用C11,章节§6.3.2.1

  

除非它是sizeof运算符的操作数,_Alignof运算符,或者   一元& operator,或者是用于初始化数组的字符串文字,一个具有的表达式   类型''数组''转换为类型为''指向类型'指针的表达式   到数组对象的初始元素,而不是左值。

和章节§6.7.6.3

  

参数声明为''类型''的数组应调整为''限定指针   输入'',其中类型限定符(如果有)是在[]内指定的类型限定符。   数组类型推导。 [...]

<强>加成:

  puts (&kette[50]);

也错了。它是一个接一个,因为C数组是基于0的索引。在这种情况下,您传递无效指针(并访问其内存位置以读取内容),您有undefined behavior

答案 1 :(得分:0)

你不能在函数参数上调用sizeof array,因为在C数组中衰减为指针。这意味着只要您致电Anzahl(&kette);&#34; 50&#34;将被丢弃,您的函数将看起来像int Anzahl(char *);。这只是您的一个问题,因为您在sizeof上致电kette[50]。这将返回char的大小,以字节为单位,应始终为1.相反,您应该调用sizeof(kette),但由于我之前提到的原因,这将无效。这可以通过将数组包装在类似的结构中来解决 typedef struct arr { char[50]; } arr;然后使用此结构代替kette[50]

你也应该拨打Anzahl(kette)而不是&kette[50],与看点相同。

答案 2 :(得分:0)

Sourav Ghosh是对的!最终版本应为:

#include <stdio.h>
#include <string.h>
int Anzahl(char kette[50]);
int main (){
    int x;
    char kette[50];
    printf ("Type down something\n");
    fgets (kette,50,stdin);
    x=Anzahl(kette);
    printf ("the number of letters is : %d", x);
}


int Anzahl (char kette[50]){
    int x1;
    puts(kette);
    //this will print 8
    x1 = sizeof(kette);
    //if you need the string length you should use
    //but this will include the \n terminator...
    return strlen(kette);
}