关于sizeof函数问题

时间:2022-03-24 19:32:30
我的问题是如果定义如下的函数,函数接口部分不能改,而我所想实现的是如何(或者能否)知道传递过去的指针所指向的内存大小?
/*
**函数功能是从src中复制n个字符到dst中
**输入参数dst和src不能是NULL
*/
void copy_n(char* const dst, char* const src,const int n)
{
/*检测参数是否为空指针*/
assert(dst!=NULL && src != NULL);

int i=0;

/*经过查资料,以下两行是直接计算dst的内存字节大小而不是计算数组长度*/
const int lenDst = sizeof(dst)/sizeof(dst[0]);//计算dst数组长度
const int lenSrc = sizeof(src)/sizeof(src[0]);//计算src数组长度

printf("%d %d\n",lenDst,lenSrc);

while( i<n && i<lenDst && i<lenSrc )
{
dst[i] = src[i];
i++;
}
printf("%s\n",dst);
if (i==n && i<lenDst)
{
dst[i] = '\0';
return;
}
/*src数组不足,以NUL填充dst*/
while(i<n && i<lenDst )
{
dst[i] = '\0';
i++;
}
/*dst数组不足,以src数组元素填充最后一个字符*/
if (i<n && i<lenSrc)
{
dst[i] = src[i];
}
}

15 个解决方案

#1


不知道你什么意思,你的参数的内存大小不是已经在实现中求出来了。

#2


没太看懂
首先sizeof不是函数,其次你说的"指针指向的内存大小"是什么概念??

#3


1 sizeof理解有误
2 不能

#4


1.无法实现你想要的功能
2.
    /*经过查资料,以下两行是直接计算dst的内存字节大小而不是计算数组长度*/    const int lenDst = sizeof(dst)/sizeof(dst[0]);//计算dst数组长度    const int lenSrc = sizeof(src)/sizeof(src[0]);//计算src数组长度

这段是错的。两个长度结果都为4,sizeof(dst)计算的是,dst变量所占的空间,指针类型都为4。

如果你定义了一个变量,char dat[100];那么sizeof(dat)的结果就为100;

#5


引用 4 楼 PDD123 的回复:
1.无法实现你想要的功能
2.
    /*经过查资料,以下两行是直接计算dst的内存字节大小而不是计算数组长度*/    const int lenDst = sizeof(dst)/sizeof(dst[0]);//计算dst数组长度    const int lenSrc = sizeof(src)/sizeof(src[0]);//计算src数组长度

这段是错的。两个长度结果都为4,sizeof(dst)计算的是,dst变量所占的空间,指针类型都为4。

如果你定义了一个变量,char dat[100];那么sizeof(dat)的结果就为100;


不是的,在函数中不一样的。你可以去试下

#6


引用 3 楼 akirya 的回复:
1 sizeof理解有误
2 不能


也就是说只能通过显示传递数组大小参数了?

#7


引用 2 楼 czarten 的回复:
没太看懂
首先sizeof不是函数,其次你说的"指针指向的内存大小"是什么概念??

就是要求函数调用时 比如前面char Merroy[20]; 调用时是copy_n(Merroy,...)这样,然后在函数里面求Merroy数组的大小

#8


首先数组名作为参数处理的时候表示指针 sizeof其大小4..
你可以通过循环判断'\0',来确定数组长度。

#9


sizeof是编译的时候计算好了, 所以没办法知道你程序运行到这里会有多大空间.

老老实实传一个长度进去吧, 最正规的做法了.

#10


sizeof是编译时就已经计算完成了,不是运行时才计算的!

#11


sizeof无能为力。
调用函数时,传入的是一个指针,任何类型(int/char....struct)的指针大小都是一样的(32位系统4字节),sizeof值一样。
解决办法:
1.商定所有char *字符串都是以 '\0'结尾,用strlen求长度
2.传入长度

#12


引用 7 楼 ZJQLOVELYY 的回复:
Quote: 引用 2 楼 czarten 的回复:

没太看懂
首先sizeof不是函数,其次你说的"指针指向的内存大小"是什么概念??

就是要求函数调用时 比如前面char Merroy[20]; 调用时是copy_n(Merroy,...)这样,然后在函数里面求Merroy数组的大小


不能的,指针只是一个地址,它只包含“从哪里开始”的信息,不包含“有多大”的信息

#13


引用 12 楼 czarten 的回复:
Quote: 引用 7 楼 ZJQLOVELYY 的回复:

Quote: 引用 2 楼 czarten 的回复:

没太看懂
首先sizeof不是函数,其次你说的"指针指向的内存大小"是什么概念??

就是要求函数调用时 比如前面char Merroy[20]; 调用时是copy_n(Merroy,...)这样,然后在函数里面求Merroy数组的大小


不能的,指针只是一个地址,它只包含“从哪里开始”的信息,不包含“有多大”的信息

指针包含了多大,但是没包含这个之后还有多少个~~

#14


引用 5 楼 ZJQLOVELYY 的回复:
Quote: 引用 4 楼 PDD123 的回复:

1.无法实现你想要的功能
2.
    /*经过查资料,以下两行是直接计算dst的内存字节大小而不是计算数组长度*/    const int lenDst = sizeof(dst)/sizeof(dst[0]);//计算dst数组长度    const int lenSrc = sizeof(src)/sizeof(src[0]);//计算src数组长度

这段是错的。两个长度结果都为4,sizeof(dst)计算的是,dst变量所占的空间,指针类型都为4。

如果你定义了一个变量,char dat[100];那么sizeof(dat)的结果就为100;


不是的,在函数中不一样的。你可以去试下


我看到你说你查了资料之后再去验证一下,才回复的,要不我就是一楼 了。

sizeof(dst),在定义dst的时候,定义成了指针,那么结果就是4,如果定义成了数组,那么结果就是数组元素大小乘以数组元素个数。而在函数void copy_n(char* const dst, char* const src,const int n)中,括号里面的“char* const dst”实际上是定义了dst,定义成了指针。

编译器在编译一个函数的时候,是只考虑函数本身的,函数是独立的。

#15


先说明一下sizeof不是函数 是关键字。和int,for, while等等是一类东西。
//下面这两句话你没有查仔细,你这么写是不对的
const int lenDst = sizeof(dst)/sizeof(dst[0]);//计算dst数组长度
const int lenSrc = sizeof(src)/sizeof(src[0]);//计算src数组长度
你这里sizeof(dst)中的dst仅仅是一个形参,它的类型是指针,所以这个就是计算一下指针的大小,等于4。
所以你这个绝对的不能进行字符串的复制。
往我的邮箱里发一个邮件我把答案和详细的解释给你发过去 
很简单的。

#1


不知道你什么意思,你的参数的内存大小不是已经在实现中求出来了。

#2


没太看懂
首先sizeof不是函数,其次你说的"指针指向的内存大小"是什么概念??

#3


1 sizeof理解有误
2 不能

#4


1.无法实现你想要的功能
2.
    /*经过查资料,以下两行是直接计算dst的内存字节大小而不是计算数组长度*/    const int lenDst = sizeof(dst)/sizeof(dst[0]);//计算dst数组长度    const int lenSrc = sizeof(src)/sizeof(src[0]);//计算src数组长度

这段是错的。两个长度结果都为4,sizeof(dst)计算的是,dst变量所占的空间,指针类型都为4。

如果你定义了一个变量,char dat[100];那么sizeof(dat)的结果就为100;

#5


引用 4 楼 PDD123 的回复:
1.无法实现你想要的功能
2.
    /*经过查资料,以下两行是直接计算dst的内存字节大小而不是计算数组长度*/    const int lenDst = sizeof(dst)/sizeof(dst[0]);//计算dst数组长度    const int lenSrc = sizeof(src)/sizeof(src[0]);//计算src数组长度

这段是错的。两个长度结果都为4,sizeof(dst)计算的是,dst变量所占的空间,指针类型都为4。

如果你定义了一个变量,char dat[100];那么sizeof(dat)的结果就为100;


不是的,在函数中不一样的。你可以去试下

#6


引用 3 楼 akirya 的回复:
1 sizeof理解有误
2 不能


也就是说只能通过显示传递数组大小参数了?

#7


引用 2 楼 czarten 的回复:
没太看懂
首先sizeof不是函数,其次你说的"指针指向的内存大小"是什么概念??

就是要求函数调用时 比如前面char Merroy[20]; 调用时是copy_n(Merroy,...)这样,然后在函数里面求Merroy数组的大小

#8


首先数组名作为参数处理的时候表示指针 sizeof其大小4..
你可以通过循环判断'\0',来确定数组长度。

#9


sizeof是编译的时候计算好了, 所以没办法知道你程序运行到这里会有多大空间.

老老实实传一个长度进去吧, 最正规的做法了.

#10


sizeof是编译时就已经计算完成了,不是运行时才计算的!

#11


sizeof无能为力。
调用函数时,传入的是一个指针,任何类型(int/char....struct)的指针大小都是一样的(32位系统4字节),sizeof值一样。
解决办法:
1.商定所有char *字符串都是以 '\0'结尾,用strlen求长度
2.传入长度

#12


引用 7 楼 ZJQLOVELYY 的回复:
Quote: 引用 2 楼 czarten 的回复:

没太看懂
首先sizeof不是函数,其次你说的"指针指向的内存大小"是什么概念??

就是要求函数调用时 比如前面char Merroy[20]; 调用时是copy_n(Merroy,...)这样,然后在函数里面求Merroy数组的大小


不能的,指针只是一个地址,它只包含“从哪里开始”的信息,不包含“有多大”的信息

#13


引用 12 楼 czarten 的回复:
Quote: 引用 7 楼 ZJQLOVELYY 的回复:

Quote: 引用 2 楼 czarten 的回复:

没太看懂
首先sizeof不是函数,其次你说的"指针指向的内存大小"是什么概念??

就是要求函数调用时 比如前面char Merroy[20]; 调用时是copy_n(Merroy,...)这样,然后在函数里面求Merroy数组的大小


不能的,指针只是一个地址,它只包含“从哪里开始”的信息,不包含“有多大”的信息

指针包含了多大,但是没包含这个之后还有多少个~~

#14


引用 5 楼 ZJQLOVELYY 的回复:
Quote: 引用 4 楼 PDD123 的回复:

1.无法实现你想要的功能
2.
    /*经过查资料,以下两行是直接计算dst的内存字节大小而不是计算数组长度*/    const int lenDst = sizeof(dst)/sizeof(dst[0]);//计算dst数组长度    const int lenSrc = sizeof(src)/sizeof(src[0]);//计算src数组长度

这段是错的。两个长度结果都为4,sizeof(dst)计算的是,dst变量所占的空间,指针类型都为4。

如果你定义了一个变量,char dat[100];那么sizeof(dat)的结果就为100;


不是的,在函数中不一样的。你可以去试下


我看到你说你查了资料之后再去验证一下,才回复的,要不我就是一楼 了。

sizeof(dst),在定义dst的时候,定义成了指针,那么结果就是4,如果定义成了数组,那么结果就是数组元素大小乘以数组元素个数。而在函数void copy_n(char* const dst, char* const src,const int n)中,括号里面的“char* const dst”实际上是定义了dst,定义成了指针。

编译器在编译一个函数的时候,是只考虑函数本身的,函数是独立的。

#15


先说明一下sizeof不是函数 是关键字。和int,for, while等等是一类东西。
//下面这两句话你没有查仔细,你这么写是不对的
const int lenDst = sizeof(dst)/sizeof(dst[0]);//计算dst数组长度
const int lenSrc = sizeof(src)/sizeof(src[0]);//计算src数组长度
你这里sizeof(dst)中的dst仅仅是一个形参,它的类型是指针,所以这个就是计算一下指针的大小,等于4。
所以你这个绝对的不能进行字符串的复制。
往我的邮箱里发一个邮件我把答案和详细的解释给你发过去 
很简单的。