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

所以为了回答你的问题,编译器分配了这块内存。