精华内容
下载资源
问答
  • 前面在看Xen的源码时,遇到了一段代码,如下所示: 注意上面最后一行的...长度为的数组在标准c和c++中是不允许的,如果使用长度为的数组,编译时会产生错误,提示数组长度不能为。但在GNUc中,这种用法却是合

    前面在看Xen的源码时,遇到了一段代码,如下所示:

    注意上面最后一行的代码,这里定义了一个长度为的数组,这种用法可以吗?为什么可以使用长度为的数组?长度为的数组到底怎么使用?……这篇文章主要针对该问题进行简单的讲解。废话不多说了,现在就开始。

    长度为的数组在标准cc++中是不允许的,如果使用长度为的数组,编译时会产生错误,提示数组长度不能为。但在GNUc中,这种用法却是合法的。它的最典型的用法就是位于数组中的最后一项,如上面所示,这样做主要是为了方便内存缓冲区的管理。如果你将上面的长度为的数组换为指针,那么在分配内存时,需采用两步:首先,需为结构体分配一块内存空间;其次再为结构体中的成员变量分配内存空间。这样两次分配的内存是不连续的,需要分别对其进行管理。当使用长度为的数组时,则是采用一次分配的原则,一次性将所需的内存全部分配给它。相反,释放时也是一样的。

    对于长度为的数组,在gcc手册中,有如下一段代码片段:

    struct line {

    int length;

    char contents[0];

    };

    struct line *thisline = (struct line *)malloc (sizeof (struct line) + this_length);

    thisline->length = this_length;

    这段代码的主要含义是定义了一个结构体,并对其进行初始化,上面结构体的第二个成员变量contents[0]事实上是不占内存空间的,因此整个结构体的长度sizeof(struct line)4。当采用malloc为其申请内存空间时,如上所示,申请了一段长度为结构体长度加可变长度的内存空间给结构体类型的指针,这时contents就指向申请的可变长度的内存空间。由于是一次申请的,所以这段可变长度的内存空间和前面的结构体长度的内存空间是连续的。对于这段可变长度的内存空间,可以采用数组的方式对其进行访问。对于整个结构体,当不再使用时,可以使用free函数一次性对其进行释放,而不必像指针那样分别释放。

    下面举例进行说明:

    #include <stdio.h>
    #include <stdlib.h>
    #define LENGTH 10

    struct test1
    {
    int a;
    int *b;
    }__attribute((packed));

    struct test2
    {
    int a;
    int b[0];
    }__attribute((packed));

    struct test3
    {
    int a;
    int b[1];
    }__attribute((packed));

    int main()
    {
    struct test1 *var1;
    struct test2 *var2;
    struct test3 *var3;
    int i;

    printf("the length of struct test1:%d\n",sizeof(struct test1));
    printf("the length of struct test2:%d\n",sizeof(struct test2));
    printf("the length of struct test3:%d\n",sizeof(struct test3));

    var1=(struct test1*)malloc(sizeof(struct test1));
    var1->a=1;
    var1->b=(int *)malloc(sizeof(int));
    *var1->b=1;
    printf("\nvar1->a=%d,*(var1->b)=%d\n",var1->a,*var1->b);

    var2=(struct test2*)malloc(sizeof(struct test2)+sizeof(int)*LENGTH);
    var2->a=2;
    printf("\nvar2->a=%d\n",var2->a);
    for(i=0;i<LENGTH;i++)
    {
    var2->b[i]=i;
    printf("var2->b[i]=%d\t",var2->b[i]);
    }
    printf("\n\n"); 

    var3=(struct test3*)malloc(sizeof(struct test3));
    var3->a=3;
    (var3->b)[0]=3;
    printf("var3->a=%d,(var3->b)[0]=%d\n",var3->a,(var3->b)[0]);


    free(var1->b);
    free(var1);
    free(var2);
    free(var3);

    }

    这段程序的运行结果如下图所示:

    从上面的结果可以看出:

    长度为的数组并不占有内存空间,而指针方式需要占用内存空间。

    对于长度为数组,在申请内存空间时,采用一次性分配的原则进行;对于包含指针的结构体,才申请空间时需分别进行,释放时也需分别释放。

    对于长度为的数组的访问可采用数组方式进行。

    展开全文
  • C语言 单词长度

    千次阅读 2019-10-03 16:53:10
    C语言 单词长度 题目内容: 你的程序要读入一行文本,其中以空格分隔为若干个单词,以‘.’结束。你要输出这行文本中每个单词的长度。这里的单词与语言无关,可以包括各种符号,比如“it’s”算一个单词,长度为4。...

    C语言 单词长度

    题目内容:

    你的程序要读入一行文本,其中以空格分隔为若干个单词,以‘.’结束。你要输出这行文本中每个单词的长度。这里的单词与语言无关,可以包括各种符号,比如“it’s”算一个单词,长度为4。注意,行中可能出现连续的空格。

    输入格式:

    输入在一行中给出一行文本,以‘.’结束,结尾的句号不能计算在最后一个单词的长度内。

    输出格式:

    在一行中输出这行文本对应的单词的长度,每个长度之间以空格隔开,行末没有最后的空格。

    输入样例:

    It's great to see you here.
    

    输出样例:

    4 5 2 3 3 4
    

    代码

    #include <stdio.h>
    #include <string.h>
    int main() {
    	int i, c = 0;
    	char a[100];
    	gets(a);
    	for (i = 0; a[i] != '.'; i++)
    	{
    		if (a[i] != ' ')
    			c++;
    		else if (c != 0)
    		{
    			printf("%d ", c);
    			c = 0;
    		}
    	}
    	if (c != 0) printf("%d", c);
    
    	return 0;
    }
    
    展开全文
  • c语言单词长度程序

    2015-06-18 10:05:14
    c语言程序
  • C语言数据长度

    2019-11-03 19:43:48
    一种说法,整型所占空间大小和CPU相关 ...C标准只规定了 int 的长度不低于 short,long 的长度不低于 int。实际上,C保证short至少有16位长,long至少有32位长,long long 至少64位长。 #include <stdio.h> #...

    一种说法,整型所占空间大小和CPU相关

    在这里插入图片描述
    但是 MinGW 的64 位gcc编译器下,long 是32位的。查了资料,原来C标准没有规定long必须是64位的。

    C标准只规定了 int 的长度不低于 short,long 的长度不低于 int。实际上,C保证short至少有16位长,long至少有32位长,long long 至少64位长。

    #include <stdio.h>
    #define SZ(t) printf("sizeof("#t"):\t%zd\n", sizeof(t));
    int main(int argc, char * argv[]){
        SZ(char);
        SZ(short);
        SZ(int);
        SZ(long);
        SZ(long long);
        SZ(float);
        SZ(double);
        SZ(long double);
        SZ(int *);
    }
    
    $ which gcc
    /mingw64/bin/gcc
    
    $ gcc --version
    gcc.exe (Rev3, Built by MSYS2 project) 9.1.0
    Copyright (C) 2019 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    
    sizeof(char):   1
    sizeof(short):  2
    sizeof(int):    4
    sizeof(long):   4
    sizeof(long long):      8
    sizeof(float):  4
    sizeof(double): 8
    sizeof(long double):    16
    sizeof(int *):  8
    
    $ which gcc
    /mingw32/bin/gcc
    $ gcc --version
    gcc.exe (Rev3, Built by MSYS2 project) 9.1.0
    Copyright (C) 2019 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    
    sizeof(char):   1
    sizeof(short):  2
    sizeof(int):    4
    sizeof(long):   4
    sizeof(long long):      8
    sizeof(float):  4
    sizeof(double): 8
    sizeof(long double):    12
    sizeof(int *):  4
    
    # 这是64-bit CentOS 下的 64 位 gcc 编译器的结果
    $ getconf LONG_BIT
    64
    $ gcc --version
    gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39)
    Copyright (C) 2015 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    
    sizeof(char):   1
    sizeof(short):  2
    sizeof(int):    4
    sizeof(long):   8
    sizeof(long long):      8
    sizeof(float):  4
    sizeof(double): 8
    sizeof(long double):    16
    sizeof(int *):  8
    

    总结

    1. 同一数据类型的有符号和无符号长度相等
    2. 指针长度等于机器字长
    3. 32和64位CPU上,float 都是32位,double 都是 64 位;
    4. 虽然 int 用习惯了,但它只保证长度不低于16位。
    5. 按C的标准,float至有6~7位精度;double 有 10 位精度(但实现一般都提供了至少 13 位有效数字)
    展开全文
  • C语言 数组长度

    千次阅读 2019-04-29 08:47:13
    借助sizeof()函数 # include <stdio.h> int main(void) { int a[10] = {0}; printf("sizeof(a) = %d\n", ...sizeof(a) = 40 ,数组 a 是 int 型的,每个元素占 4 字节,所以长度为 10 的数组在内存中所占的...

    借助sizeof()函数

    # include <stdio.h>
    int main(void)
    {   
        int a[10] = {0};
        printf("sizeof(a) = %d\n", sizeof(a));
        return 0;
    }
    

    sizeof(a) = 40 ,数组 a 是 int 型的,每个元素占 4 字节,所以长度为 10 的数组在内存中所占的字节数就是 40。而总的字节数除以一个元素所占的字节数就是数组的长度,如下面这个程序:

    # include <stdio.h>
    int main(void)
    {   
        int a[10] = {0};
        // 计算数组中数据长度 :
        // 所有数据的字节数除以一个数据的字节数即为数据的个数 :
        //int length = sizeof(arr) / sizeof(int); //这句也可以
        int cnt = sizeof(a) / sizeof(a[0]);
        printf("cnt = %d\n", cnt);
        return 0;
    }
    

    输出结果是:
    cnt = 10

    这样不管数组是增加还是减少元素,sizeof(a)/sizeof(a[0]) 都能自动求出数组的长度。需要注意的是,它求出的是数组的总长度,而不是数组中存放的有意义的数据的个数。比如定义一个int型的数组:

    int a[10] = {1, 2, 3, 4, 5};
    

    我们只初始化了五个元素,但是 sizeof(a)/sizeof(a[0]) 求出的是 10,而不是 5。换句话说,我们无法通过 sizeof(a)/sizeof(a[0]) 求出数组中有多少个有意义的数据。

    参数传递

    通过传递数组名参数到子函数中,以获得数组长度是不可行的。

    #include<stdio.h>
    
    void test(int arr[])
    {
    	int length = 0;
    	length = sizeof(arr) / sizeof(int);
    	printf("test_数组的总字节数为: %d\n",sizeof(arr));
    	printf("test_数组的长度为: %d\n",length);
    }
    
    int main()
    {
    	// 定义一个整型数组, 并进行初始化赋值9个数据 : 
    	int arr[] = {1,2,3,4,5,6,7,8,9};
    	int length = 0;
    	// 计算数组中数据长度 :
    	// 所有数据的字节数除以一个数据的字节数即为数据的个数 : 
    	length = sizeof(arr) / sizeof(int); 
    	printf("main_数组的长度为: %d\n",length);
    	
    	test(arr);
    	
    	return 0;
    } 
    

    在这里插入图片描述
    代码分析 :
    当将数组作为实参传递到另一个函数中时, 另一个函数的形参相当于一个指针变量, 因为将数组的名作为实参时, 就是将数字的首地址作为实参, 所以在test函数中输出的
    sizeof(arr)其实得到的是一个整型数组的长度(所占的字节数), 所以结果是8, 再用其除以int所占的字节数(4), 结果就是2 。(64位) 。32位机上是1。

    因此,获得数组长度,只能在数组定义所在的代码区中,采用以上方法,才可以达到效果。

    展开全文
  • c语言数组长度

    2020-09-30 17:17:07
    [img=https://img-bbs.csdn.net/upload/202009/30/1601457329_393373.png][/img]请问这样子是什么情况 要怎么才能得到数组的长度为8
  • C语言 单词长度 代码

    千次阅读 2020-11-06 09:49:06
    中国大学MOOC上浙江大学翁恺老师的 程序设计入门——C语言 课程第八章作业中有“单词长度”一题 题目内容: 你的程序要读入一行文本,其中以空格分隔为若干个单词,以‘.’结束。你要输出这行文本中每个单词的长度。...
  • C语言 求数组长度

    2015-10-24 15:42:25
    C语言 数组长度
  • 想问一下vs2019能处理的c语言标识符长度,求大神。或者哪里能看vs2019支持
  • C语言 变量 长度

    千次阅读 2013-03-05 17:14:51
    每种编译器可以为硬件选择适合的长度,仅受一些限制,如short 和int 型数据至少占16位,long型至少占32位, short型数据不能超过int型数据的字节数,而int型不长于long 型。       无符号的数总是正数或零,...
  • C语言结构体长度的计算

    千次阅读 2018-06-23 11:50:55
    C语言的编译过程是从上到下的。 结构体某成员的地址偏移量必须为该成员的整数倍,如果不是整数倍,则前面成员变量需要填充。 结构体最后一个成员所占字节的长度=max(所有的成员长度)。 下面以一例子来解说:  ...
  • C语言数组长度极限

    千次阅读 2017-06-18 14:58:39
    今天在做《计算机图学实验》大作业的时候,定义了一个数组用于存放顶点坐标,数组长度为1025*1025,可是总是弹出错误,最后经过上网查找,发现错误原因在于我的数组是在函数体内定义的。 函数体内定义的的数组存在...
  • C语言类型长度汇总

    千次阅读 2018-04-19 09:20:48
    16位机 32位机 64位机 char 1 1 1 short int 2 2 2 Int 2 4 4 unsigned int 2 4 4 float 4 4 ...注:char,short int,float,double长度固定不变
  • C语言获取数组长度

    万次阅读 多人点赞 2019-03-09 10:22:34
    1、c语言中,定义数组后可以用sizeof命令获得数组的长度(可容纳元素个数)。 例如: double a[] = {1,2,3,4}; int length; length=sizeof(a)/sizeof(a[0]); //数组占内存总空间,除以单个元素占内存空间大小 printf...
  • c语言求数组长度

    千次阅读 2020-10-10 21:11:57
    C语言对于不同的数据类型的数组求长度方式稍微有不同的地方: 1,对于字符数组求长度 第一种使用strlen() #include<stdio.h> #include<string.h> int main() { char a[10]="dmeo"; printf("%d",strlen...
  • C语言0长度数组(可变数组/柔性数组)详解

    万次阅读 多人点赞 2017-03-20 19:37:26
    C语言0长度数组(可变数组/柔性数组)详解 CSDN GitHub C语言0长度数组(可变数组/柔性数组)详解 AderXCoding/language/c/zero_length_array 本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议...
  • C语言字符串长度

    2016-12-23 17:27:22
    C语言字符串长度的计算是编程时常用到的,也是求职时必考的一项。 C语言本身不限制字符串的长度,因而程序必须扫描完整个字符串后才能确定字符串的长度。 在程序里,一般会用strlen()函数或sizeof来获取一个字符串...
  • C语言求数组长度

    千次阅读 2018-12-02 19:51:46
    我们很苦恼的是,C语言不像JAVA那样把所有的方法都给我们封装好了,我们可以直接拿来用。那么我们该如何求一个未满的数组的长度呢?下面给你一个方法: #include&amp;amp;amp;amp;amp;lt;stdio.h&amp;amp;...
  • C语言 数组长度函数

    千次阅读 2013-05-06 08:48:53
    1.用宏是可以的这样写 #define ArraySize(ARR) (sizeof(ARR) / sizeof(ARR[0])) 楼上的楼上要加括号的。 #include ...#define ArraySize(ARR) (sizeof(ARR)/sizeof(ARR[0])) ...printf( "Arr
  • C语言:单词长度

    千次阅读 2019-07-16 22:39:30
    题目内容: 你的程序要读入一行文本,其中以空格分隔为若干个单词,以‘.’结束。你要输出这行文本中每个单词的长度。...在一行中输出这行文本对应的单词的长度,每个长度之间以空格隔开,行末没有...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,354
精华内容 6,541
关键字:

c语言长度

c语言 订阅