我正在尝试学习C语言,作为一个开始,我开始为自己的实践编写一个strcpy。正如我们所知,最初的strcpy很容易出现安全问题,所以我给自己的任务是编写一个“安全的”strcpy。
我选择的路径是检查源字符串(字符数组)是否实际适合目标内存。据我所知,C中的字符串只不过是指向字符数组的指针,以0x00结尾。
所以我的挑战是如何找出编译器实际上为目标字符串保留了多少内存?
我试过了:
sizeof(dest)但这不起作用,因为它将返回(正如我后来发现的) dest的大小,在我的64位机器上,它实际上是一个指针,总是返回8。
我也试过了:
strlen(dest)但这也不起作用,因为它只返回遇到第一个0x0之前的长度,这并不一定反映实际保留的内存。
因此,这一切都归结为以下问题:如何找到编译器为我的目的地“字符串”保留了多少内存?
示例:
char s[80] = "";
int i = someFunction(s); // should return 80什么是"someFunction"?
提前感谢!
发布于 2013-01-27 22:08:48
您可以在编译时使用sizeof进行检查:
char s[80] = "";
int i = sizeof s ; // should return 80请注意,如果s是指针,则此操作将失败:
char *s = "";
int j = sizeof s; /* probably 4 or 8. */数组不是指针。为了跟踪分配给指针的大小,程序只需跟踪它。此外,您不能将数组传递给函数。当您使用数组作为函数的参数时,编译器会将其转换为指向第一个元素的指针,因此,如果您希望该大小可用于被调用的函数,则必须将其作为参数传递。例如:
char s[ SIZ ] = "";
foo( s, sizeof s );发布于 2013-01-27 22:07:54
一旦你将一个char指针传递给你正在编写的函数,你将不知道有多少内存被分配给s。你需要将这个大小作为参数传递给函数。
发布于 2013-01-27 22:13:03
所以这一切都归结为以下问题:如何找到编译器为我的目的地“字符串”保留了多少内存?
没有可移植的方法来找出分配了多少内存。你必须自己跟踪它。
实现必须跟踪有多少内存被malloc到一个指针,它可能会让你找到一些可用的东西。例如,glibc的malloc.h公开了
size_t malloc_usable_size (void *__ptr)这使您可以访问大致的信息,但是,它不会告诉您请求了多少,而是告诉您有多少是可用的。当然,这只适用于你从malloc (和朋友)那里获得的指针。对于数组,只能在数组本身在作用域中的情况下使用sizeof。
https://stackoverflow.com/questions/14548150
复制相似问题