C语言中的sizeof中的数组和指针

1.引子

今日在看动态规划的0-1背包问题,看完后还是打算自己写着试试,毕竟实践才能出真知嘛.动态规划的结果是个二维数组dp,我copy书上的例子进行初始 memset(dp,0,sizeof(dp)),考虑到程序的健壮性,对于数组我都是用的动态申请,自然二维数组也不例外[动态二维数组的建立可参见本blog的延伸].

程序写完后,但是却不能运行,开始单步调试,当进行到dp的赋值时老是报指针的错误!!!开始我以为是指针越界什么的,仔细才发现dp的数组维数确实要多申请一个用来存放初始情况的值(全是0).但还是不行.只要乖乖的用两个for循环来赋值,这下程序确实可以出结果了.这说明刚才确实是初始化的时候出了问题.这才把问题瞄准了memset(dp,0,sizeof(dp)).

printf("%d",sizoef(dp)); 我的dp是5行6列,结果是4?

2.思考

百度下memset,尤其是对整形数组进行初始化的部分.memset是以字节为单位进行初始化的.然后自己就写了个一维数组的demo试试:

1  int b[5];
2  int *c;
3  c = malloc(sizeof(int)*5);
4  memset(b,0,sizeof(b)); // 这个是可以成功的
5  memset(c,0,sizeof(c)); // 也可以执行
6  printf("%d",b[2]);  //结果是0,b[0~3] = 0;
7  printf("%d",c[2]);  //结果却不是0!!!;
8  printf("%d %d",sizeof(b),sizeof(c));

b[2] 与 c[2]的值不一样,两者的初始化的差别就在sizeof(b)与sizeof(c)上,这两个的结果是20,4!!!

memset是以字节为单位进行初始化,第4行对b的20个字节全部初始化了,第5行只对c的前4个字节初始化了,c指向的还是20个字节的内存,所以c[0] = 0;但是c[1~3]就不是了.

这两个的不同差别在哪呢?参阅sizeof

首先这是个操作符而不是一个函数.计算数据类型的长度符的.上述中c和b都是存放5个整数,有什么不同吗?

int b[]是一个数组,sizeof()值是其数据类型的sizeof值*其数组的长度;

   int *c是一个指针变量,sizeof中说明了一个指针变量的sizeof值必定是4(32bit),与其指向的数据类型无关;

3.解决

然后在看动态规划的例子中dp是声明的二维数组dp[][],而我是的是int **dp;是一个指向指针的指针,所以是4;

参考对一维数组初始化的例子,可以这样:

 1 // C++ -version
 2 int **array;
 3 array=new int *[10];
 4 for(int i=0;i<10;i++)
 5
 6 {
 7          array[i]=new int [5];
 8
 9        memset(array[i],0,5*sizeof(int));
10
11 }

c语言的把new 换成malloc即可!

4.延伸

1. 动态的二维数组

1 int r,c;
2 int **a;  //创建二维指针来指向数组
3 scanf("%d%d",&r,&c);
4 a  = (int **) malloc(sizeof(int *) * r);//注意申请的指针格式
5 for (j=0;j<r;j++){
6 a[j] = (int *) malloc(sizeof(int) * c);
7 ……
8 ……
9 }

2. memset对整形数组初始化的错误是初始化为1,memset对整形只能初始化为0,这个情况memset中有讲;

更多阅读课参考如下:

http://blog.csdn.net/qtyl1988/article/details/8033181

PS: 此blog是过了一夜写的,个人也忘了当初怎么就把错误的原因一步步的关注到sizeof的,我记得我好想开始还不是关注的此处.反正是又学到了!

C语言中的sizeof中的数组和指针,布布扣,bubuko.com

时间: 2024-10-07 05:31:46

C语言中的sizeof中的数组和指针的相关文章

转]解析C语言中的sizeof

解析C语言中的sizeof 一.sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++.--等.它并不是函数.sizeof操作符以字节形式给出 了其操作数的存储大小.操作数可以是一个表达式或括在括号内的类型名.操作数的存储大小由操作数的类型决定. 二.sizeof的使用方法 1.用于数据类型 sizeof使用形式:sizeof(type) 数据类型必须用括号括住.如sizeof(int). 2.用于变量 sizeof使用形式:sizeof(var_name)或size

C语言中的sizeof关键字

说明: ******C语言中的sizeof是一个关键字,也是一个操作符,并不是一个函数,用来计算某一变量,或数据类型所占用的内存字节数. ******sizeof有三种使用方式: ***sizeof(变量名)    (加括号) ***sizeof  变量名  (不加括号) ***sizeof(数据类型) C语言中的sizeof关键字

C语言中的sizeof函数总结

sizeof函数的结果: 变量:变量所占的字节数. int i = 0; printf("%d\n", sizeof(i)); //4 数组:数组所占的字节数. int arr_int1[] = {1,2,3,4,5}; int arr_int2[10] = {1,2,3,4,5}; printf("size_arr1=%d\n",sizeof(arr_int1)); //5*4=20 printf("size_arr2=%d\n",sizeof

浅谈C中的数组和指针(二)

原文转载地址:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242419.html 在原文基础上增加自己的理解作为修改 浅谈C/C++中的指针和数组(二) 前面已经讨论了指针和数组的一些区别,然而在某些情况下,指针和数组是等同的,下面讨论一下什么时候指针和数组是相同的. C语言标准对此作了说明: 规则1:表达式中的数组名被编译器当做一个指向该数组第一个元素的指针: 注:下面几种情况例外 1)数组名作为sizeof的操作数 2)使用&

C语言中的数组与指针

1. 数组的初始化 数组的初始化方法有很多,常用的方法有 定义时初始化 int arr[3]={1,2,3}; 或 int arr[3]={2}; //未初始化的元素全为0: 定义后遍历赋值初始化 int arr[3]; for(int i=0;i<3;i++) arr[i]=i; C99之后,出现了另一种十分方便的初始化方式.即利用元素位置来初始化该元素,使用方法如下 int arr[5]={[3]=1,3} 初始化后的结果 arr[5]={0,0,0,1,3} 此种方式的缺点是,后面的初始化

C语言中,当计算字符数组长度时,用sizeof 和strlen 的原理及两者的区别

字符数组的长度计算:必须以终止符'\0'作为边界,但对字符数组赋值时,有两种方式: 1:定义时用字符初始化 (1)char chs[7] = {'a', 'c', '0', 'z', '3','d'}; // 长度为6 上式等价于: (2)char chs[7] = {'a', 'c', '0', 'z', '3','d', '/0'}; // 长度为6 也等价于: (3)char chs[] = {'a', 'c', '0', 'z', '3','d', '/0' }; // 长度为6 但不等

C语言中的memset函数和数组指针

代码: 1 #include <iostream> 2 #include <cstring> 3 4 using namespace std; 5 6 int main(){ 7 int a[5] = {1}; 8 memset(a,5,sizeof(a)); 9 cout<<a[0]<<" "<<a[1]<<endl; 10 cout<<a<<" "<<a+

C语言中的sizeof和strlen

1.sizeof是算符,strlen是函数: 2.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的: 3.大部分编译程序,在编译的时候就把sizeof计算过了,这是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因: 4.strlen的结果要在运行的时候才能计算出来,用来计算字符串的长度,不是类型占内存的大小: 5.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧,这是因为sizeof是个操作符不是个函数. 示例代码:

go语言中regexp包中的函数和方法

// regexp.go ------------------------------------------------------------ // 判断在 b 中能否找到正则表达式 pattern 所匹配的子串 // pattern:要查找的正则表达式 // b:要在其中进行查找的 []byte // matched:返回是否找到匹配项 // err:返回查找过程中遇到的任何错误 // 此函数通过调用 Regexp 的方法实现 func Match(pattern string, b []