c编程,如何通过使用指针作为参数的函数获取变量的sizeof?
c programming, How can i get the sizeof a variable through a function using a pointer as a parameter?
如何通过使用指针作为参数的函数获取变量的大小?
readEachChar(unsigned char * input){
printf("The the size of the string %zu", sizeof(input));
for (size_t i = 0; i < sizeof(input); i++) // currently it show me the size of the pointer (8 bytes)
{
printf("[%x]",input[i]);
}
printf("\n");
}
unsigned char text[] = "thisisalongkindofstring";
int main(){
readEachChar(&text);
return 0;
}
对于初学者来说,这个调用中的参数表达式
readEachChar(&text);
具有类型 unsigned char ( * )[24]
。但是函数参数的类型 unsigned char *
是不兼容的类型。
因此编译器应该发出一条消息。
如果你会写
readEachChar(text);
然后在函数中你应该像
一样调用函数strlen
for (size_t i = 0, n = strlen( input ); i < n; i++)
{
printf("[%x]",input[i]);
}
否则,如果传递的数组不包含字符串,则必须使用第二个参数声明该函数,该参数将分配给传递的数组中的元素数。
在行
printf("The the size of the string %zu", sizeof(input));
sizeof
运算符将为您提供指针的大小 input
。它不会给你它指向的对象的大小(可能是数组的大小或字符串的长度)。
在函数main
中,定义
unsigned char text[] = "thisisalongkindofstring";
将使 text
成为一个包含 24 个字符的数组:这 24 个字符由 23 个实际字符和一个空终止字符的额外字符组成。在 C 中,根据定义,字符串是由空字符终止的字符序列,即具有字符代码 0
.
的字符
因此,为了确定字符串的长度,必须对字符串的每个字符进行计数,直到遇到终止空字符。你可以自己做,也可以使用 C 标准库提供的函数 strlen
。
此外,对于字符串的单个字符,通常使用 char
数据类型,而不是 unsigned char
。 C 标准库的所有字符串处理函数都需要 char *
类型的参数,而不是 unsigned char *
,因此,根据您的编译器,混合这些数据类型可能会给您警告甚至错误。
另一个问题是这一行是错误的:
readEachChar(&text);
函数readEachChar
似乎期望函数参数是指向字符串第一个字符的指针,而不是指向整个数组的指针。因此,您应该写 &text[0]
而不是 &text
。你也可以简单地写 text
,因为这个表达式将 automatically decay 到 &text[0]
.
应用上述所有修复后,您的代码应如下所示:
#include <stdio.h>
#include <string.h>
void readEachChar( char * input )
{
size_t len = strlen( input );
printf( "The size of the string: %zu\n", len );
for ( size_t i = 0; i < len; i++ )
{
printf( "[%x]", input[i] );
}
printf("\n");
}
int main()
{
char text[] = "thisisalongkindofstring";
readEachChar( text );
return 0;
}
这个程序有以下输出:
The size of the string: 23
[74][68][69][73][69][73][61][6c][6f][6e][67][6b][69][6e][64][6f][66][73][74][72][69][6e][67]
你不能只要求 sizeof(pointer) 因为你会得到指针本身的大小。
取而代之的是-您可以更改函数以获取大小作为参数:
readEachChar(unsigned char * input, unsigned size)
并从 main 发送尺寸:readEachChar(&text, sizeof(text));
另一种解决方案是 运行 遍历字符,直到到达空值 - 末尾的 '\0' 并计算其中的字符数 - 这就是 strlen
函数的作用。
How can i get the sizeof a variable through a function using a pointer as a parameter?
printf("The the size of the string %zu", sizeof(input));
确实打印变量input
的大小,它是一个指针。明显的 OP 想要其他东西的大小,例如 text[]
.
的大小
要获取对象的大小,请将该大小传递给函数。
void foo_sz(size_t sz) {
printf("Size: %zu\n", sz);
}
// Call
foo_sz(sizeof text);
要获取对象的大小和对象的地址,请同时传递两者。
void foo_both(size_t sz, void *ptr) {
printf("Size: %zu\n", sz);
printf("Ptr: %p\n", ptr);
}
// Call
foo_both(sizeof text, text);
通过使用指针作为参数的函数获取变量的大小,每个类型的原型
// 123456789012345678901234
// "thisisalongkindofstring"
void foo_1(unsigned char (*ptr)[24]) {
printf("Size: %zu\n", sizeof *ptr);
printf("Ptr: %p\n", (void *) ptr);
}
// Call
foo_1(&text);
当然现在代码失去了通用方面,但确实满足了“使用指针通过函数调整变量大小”的目标。
或者考虑使用宏来调用 1 个参数,但同时传递大小和地址。
#define FOO_M(obj) foo_both(sizeof(obj), &(obj))
// Call
FOO_M(text);
如果 obj
是 VLA 或表达式,则存在其他问题。
如何通过使用指针作为参数的函数获取变量的大小?
readEachChar(unsigned char * input){
printf("The the size of the string %zu", sizeof(input));
for (size_t i = 0; i < sizeof(input); i++) // currently it show me the size of the pointer (8 bytes)
{
printf("[%x]",input[i]);
}
printf("\n");
}
unsigned char text[] = "thisisalongkindofstring";
int main(){
readEachChar(&text);
return 0;
}
对于初学者来说,这个调用中的参数表达式
readEachChar(&text);
具有类型 unsigned char ( * )[24]
。但是函数参数的类型 unsigned char *
是不兼容的类型。
因此编译器应该发出一条消息。
如果你会写
readEachChar(text);
然后在函数中你应该像
一样调用函数strlen
for (size_t i = 0, n = strlen( input ); i < n; i++)
{
printf("[%x]",input[i]);
}
否则,如果传递的数组不包含字符串,则必须使用第二个参数声明该函数,该参数将分配给传递的数组中的元素数。
在行
printf("The the size of the string %zu", sizeof(input));
sizeof
运算符将为您提供指针的大小 input
。它不会给你它指向的对象的大小(可能是数组的大小或字符串的长度)。
在函数main
中,定义
unsigned char text[] = "thisisalongkindofstring";
将使 text
成为一个包含 24 个字符的数组:这 24 个字符由 23 个实际字符和一个空终止字符的额外字符组成。在 C 中,根据定义,字符串是由空字符终止的字符序列,即具有字符代码 0
.
因此,为了确定字符串的长度,必须对字符串的每个字符进行计数,直到遇到终止空字符。你可以自己做,也可以使用 C 标准库提供的函数 strlen
。
此外,对于字符串的单个字符,通常使用 char
数据类型,而不是 unsigned char
。 C 标准库的所有字符串处理函数都需要 char *
类型的参数,而不是 unsigned char *
,因此,根据您的编译器,混合这些数据类型可能会给您警告甚至错误。
另一个问题是这一行是错误的:
readEachChar(&text);
函数readEachChar
似乎期望函数参数是指向字符串第一个字符的指针,而不是指向整个数组的指针。因此,您应该写 &text[0]
而不是 &text
。你也可以简单地写 text
,因为这个表达式将 automatically decay 到 &text[0]
.
应用上述所有修复后,您的代码应如下所示:
#include <stdio.h>
#include <string.h>
void readEachChar( char * input )
{
size_t len = strlen( input );
printf( "The size of the string: %zu\n", len );
for ( size_t i = 0; i < len; i++ )
{
printf( "[%x]", input[i] );
}
printf("\n");
}
int main()
{
char text[] = "thisisalongkindofstring";
readEachChar( text );
return 0;
}
这个程序有以下输出:
The size of the string: 23
[74][68][69][73][69][73][61][6c][6f][6e][67][6b][69][6e][64][6f][66][73][74][72][69][6e][67]
你不能只要求 sizeof(pointer) 因为你会得到指针本身的大小。 取而代之的是-您可以更改函数以获取大小作为参数:
readEachChar(unsigned char * input, unsigned size)
并从 main 发送尺寸:readEachChar(&text, sizeof(text));
另一种解决方案是 运行 遍历字符,直到到达空值 - 末尾的 '\0' 并计算其中的字符数 - 这就是 strlen
函数的作用。
How can i get the sizeof a variable through a function using a pointer as a parameter?
printf("The the size of the string %zu", sizeof(input));
确实打印变量input
的大小,它是一个指针。明显的 OP 想要其他东西的大小,例如 text[]
.
要获取对象的大小,请将该大小传递给函数。
void foo_sz(size_t sz) {
printf("Size: %zu\n", sz);
}
// Call
foo_sz(sizeof text);
要获取对象的大小和对象的地址,请同时传递两者。
void foo_both(size_t sz, void *ptr) {
printf("Size: %zu\n", sz);
printf("Ptr: %p\n", ptr);
}
// Call
foo_both(sizeof text, text);
通过使用指针作为参数的函数获取变量的大小,每个类型的原型
// 123456789012345678901234
// "thisisalongkindofstring"
void foo_1(unsigned char (*ptr)[24]) {
printf("Size: %zu\n", sizeof *ptr);
printf("Ptr: %p\n", (void *) ptr);
}
// Call
foo_1(&text);
当然现在代码失去了通用方面,但确实满足了“使用指针通过函数调整变量大小”的目标。
或者考虑使用宏来调用 1 个参数,但同时传递大小和地址。
#define FOO_M(obj) foo_both(sizeof(obj), &(obj))
// Call
FOO_M(text);
如果 obj
是 VLA 或表达式,则存在其他问题。