C 函数和 char *
C function and char *
我有这个功能:
void print_pol(char* pol); //or char[]
printf("%s", pol);
}
在main()
中,我调用这个函数如下
print_pol("pol1");
但是我在程序中没有为char* pol
分配内存。那么这怎么可能呢?我知道指针必须指向某物。
"poll1"
是长度为 6 的字符数组 char[6]
的字符串文字。数据本身存储在只读存储器中。你的函数参数 pol
可能看起来像一个数组,但它被调整为 char*
,给你这个:
void print_pol(char* pol){ ...
当您将文字传递给函数时,它会退化为指向其第一个元素的指针。您这边不需要分配。
在您的代码中,"pol1"
称为 string literal. During compilation time, this data is stored into some memory area (usually read-only memory, which cannot be altered, or atleast any attempt to alter the contents will result in UB),它由编译器本身分配。
当你使用它时,你实际上传递了字符串文字的基地址并将其收集到一个 char *
中(在函数参数中使用时与 char []
相同)。您这边不需要任何分配。
void print_pol(char pol[])
{
printf("%s", pol);
}
int main()
{
print_pol("pol1");
return 0;
}
一旦你调用函数print_pol("pol1")
,在函数定义中它被转换为一个指针并且print_pol(char* pol);
char *pol
精确指向字符数组的第一个位置。
因此不需要或分配内存。
编译器编译print_pol("pol1")
如下:
在可执行映像的只读内存段中分配一个5个连续字符的块,包含字符'p'
、'o'
、'l'
、 '1'
后跟空字符 ('[=15=]'
).
将该块的内存地址传递给函数print_pol
。
所以为了回答你的问题,编译器分配了这块内存。
我有这个功能:
void print_pol(char* pol); //or char[]
printf("%s", pol);
}
在main()
中,我调用这个函数如下
print_pol("pol1");
但是我在程序中没有为char* pol
分配内存。那么这怎么可能呢?我知道指针必须指向某物。
"poll1"
是长度为 6 的字符数组 char[6]
的字符串文字。数据本身存储在只读存储器中。你的函数参数 pol
可能看起来像一个数组,但它被调整为 char*
,给你这个:
void print_pol(char* pol){ ...
当您将文字传递给函数时,它会退化为指向其第一个元素的指针。您这边不需要分配。
在您的代码中,"pol1"
称为 string literal. During compilation time, this data is stored into some memory area (usually read-only memory, which cannot be altered, or atleast any attempt to alter the contents will result in UB),它由编译器本身分配。
当你使用它时,你实际上传递了字符串文字的基地址并将其收集到一个 char *
中(在函数参数中使用时与 char []
相同)。您这边不需要任何分配。
void print_pol(char pol[])
{
printf("%s", pol);
}
int main()
{
print_pol("pol1");
return 0;
}
一旦你调用函数print_pol("pol1")
,在函数定义中它被转换为一个指针并且print_pol(char* pol);
char *pol
精确指向字符数组的第一个位置。
因此不需要或分配内存。
编译器编译print_pol("pol1")
如下:
在可执行映像的只读内存段中分配一个5个连续字符的块,包含字符
'p'
、'o'
、'l'
、'1'
后跟空字符 ('[=15=]'
).将该块的内存地址传递给函数
print_pol
。
所以为了回答你的问题,编译器分配了这块内存。