请问一个C语言中sizeof的有关问题
请教一个C语言中sizeof的问题
这是一个冒泡排序,问题是:我想用sizeof求数组的大小,但是得到的答案b是2而非5. 请问为什么,请教改进方法(注释段是我本来的方法)
------解决方案--------------------
数组做参数的时候,就成指针了。
------解决方案--------------------
怎么可能,我试了一下都是5
------解决方案--------------------
数组做参数弱化为指针,所以在函数sort中 sizeof(a) == sizeof(int*)
------解决方案--------------------
------解决方案--------------------
用c++编译器试试
------解决方案--------------------
在进行函数传参时,你传递的只是数组的首地址而已,并没有将整个数组传过去,你的函数形参列表不论是 *p还是p[],都当做*p来看,所以sizeof(p)==4;
------解决方案--------------------
a作为数组名,类型应该是指针吧。sizeof求的是该类型内存大小,整形占4个字节,指针在不同的平台上占大小不同,64位机应该就是8个字节,得到的是2。而32位机占8个字节,得到的是1。
------解决方案--------------------
gcc编译器下如果这样写的话,你把数组名a传进去的话,我可以告诉你,b的值一定是1;
为什么呢?
因为数组名做形参的时候,传进来的数组a就是个数组a的地址,你用sizeof(b)得到的是一个指针变量的大小(32位系统下是是4字节,64位系统下是8字节),所以你获取的是b值是1;
而如果你在数组中需要用到数组的大小,在给sort函数天剑一个数组大小的int参数,可以在main函数中用sizeof(a)获取后传给这个参数即可。
------解决方案--------------------
你这样说不太对吧,很简单,你定义一个数组int a[10];
sizeof(a)/sizeof(a[0])肯定是10,但若函数的形参为数组,实际上是当做指针来处理的,情况就不一样了
------解决方案--------------------
数组在作为函数参数时退化为指针,int b=sizeof(a)/sizeof(int);利用这段求数组大小是错误的,应该在添加个参数来指定数组长度。
#include<stdio.h>
void sort(int a[] ,int b){
int temp,n,m;
for(n=0;n<b;n++){
for(m=0;m<b-n;m++){
if(a[m]>a[m+1]){
temp=a[m];
a[m]=a[m+1];
a[m+1]=temp;
}
}
}
for(n=0;n<5;n++){
printf("%d\t",a[n]);
}
printf("\n");
}
------解决方案--------------------
如果能够计算数组的大小,那在排序时还要传入数组长度干什么呢
------解决方案--------------------
数组作参数,传递的是指针,所以sizeof(a)是等于4的。
这是一个冒泡排序,问题是:我想用sizeof求数组的大小,但是得到的答案b是2而非5. 请问为什么,请教改进方法(注释段是我本来的方法)
#include<stdio.h>
void sort(int a[]){
int temp,n,m;
// int b=sizeof(a)/sizeof(int);利用这段求数组大小
int b=4;
for(n=0;n<b;n++){
for(m=0;m<b-n;m++){
if(a[m]>a[m+1]){
temp=a[m];
a[m]=a[m+1];
a[m+1]=temp;
}
}
}
for(n=0;n<5;n++){
printf("%d\t",a[n]);
}
printf("\n");
}
int main(){
int a[5]={12,1,22,3,5};
sort(a);
return 0;
}
------解决方案--------------------
#include<stdio.h>
void sort(int a[], int num){
int temp,n,m;
// int b=sizeof(a)/sizeof(int);利用这段求数组大小
int b=num;
for(n=0;n<b;n++){
for(m=0;m<b-n;m++){
if(a[m]>a[m+1]){
temp=a[m];
a[m]=a[m+1];
a[m+1]=temp;
}
}
}
for(n=0;n<5;n++){
printf("%d\t",a[n]);
}
printf("\n");
}
int main(){
int a[5]={12,1,22,3,5};
sort(a, sizeof(a)/sizeof(int));
return 0;
}
数组做参数的时候,就成指针了。
------解决方案--------------------
怎么可能,我试了一下都是5
------解决方案--------------------
数组做参数弱化为指针,所以在函数sort中 sizeof(a) == sizeof(int*)
------解决方案--------------------
void fsort (int a[], int len);
------解决方案--------------------
#include<stdio.h>
void sort(int (&a)[5])
{
int temp,n,m;
int b=sizeof(a)/sizeof(int);//这段求数组大小
//t b=4;
for(n=0;n<b;n++)
{
for(m=0;m<b-n;m++)
{
if(a[m]>a[m+1])
{
temp=a[m];
a[m]=a[m+1];
a[m+1]=temp;
}
}
}
for(n=0;n<5;n++){
printf("%d\t",a[n]);
}
printf("\n");
}
int main(){
int a[5]={12,1,22,3,5};
sort(a);
return 0;
}
用c++编译器试试
------解决方案--------------------
在进行函数传参时,你传递的只是数组的首地址而已,并没有将整个数组传过去,你的函数形参列表不论是 *p还是p[],都当做*p来看,所以sizeof(p)==4;
------解决方案--------------------
a作为数组名,类型应该是指针吧。sizeof求的是该类型内存大小,整形占4个字节,指针在不同的平台上占大小不同,64位机应该就是8个字节,得到的是2。而32位机占8个字节,得到的是1。
------解决方案--------------------
gcc编译器下如果这样写的话,你把数组名a传进去的话,我可以告诉你,b的值一定是1;
为什么呢?
因为数组名做形参的时候,传进来的数组a就是个数组a的地址,你用sizeof(b)得到的是一个指针变量的大小(32位系统下是是4字节,64位系统下是8字节),所以你获取的是b值是1;
而如果你在数组中需要用到数组的大小,在给sort函数天剑一个数组大小的int参数,可以在main函数中用sizeof(a)获取后传给这个参数即可。
------解决方案--------------------
你这样说不太对吧,很简单,你定义一个数组int a[10];
sizeof(a)/sizeof(a[0])肯定是10,但若函数的形参为数组,实际上是当做指针来处理的,情况就不一样了
------解决方案--------------------
数组在作为函数参数时退化为指针,int b=sizeof(a)/sizeof(int);利用这段求数组大小是错误的,应该在添加个参数来指定数组长度。
#include<stdio.h>
void sort(int a[] ,int b){
int temp,n,m;
for(n=0;n<b;n++){
for(m=0;m<b-n;m++){
if(a[m]>a[m+1]){
temp=a[m];
a[m]=a[m+1];
a[m+1]=temp;
}
}
}
for(n=0;n<5;n++){
printf("%d\t",a[n]);
}
printf("\n");
}
------解决方案--------------------
如果能够计算数组的大小,那在排序时还要传入数组长度干什么呢
------解决方案--------------------
数组作参数,传递的是指针,所以sizeof(a)是等于4的。