C - 我的 strlen 在 2 个不同的编译器中的工作方式不同,有什么解释吗?



我正在使用我安装的gcc编译器,我从我的cmd运行(在编辑器中编写可视化代码)并且为了调试,我还安装了Visual studio。 这是我的第二个学期,我刚刚了解了malloc/calloc等。

所以行:

ch_pointer = (char *)malloc(length * sizeof(char));

在我的 GCC 编译器中,当我使用strlen(ch_pointer)24作为答案时,会给出回报。

如果我使用一个太大的数字(例如 100)作为长度,它也只是说strlen(ch_pointer) == 0.

如果我在视觉工作室中将其编写为:

ch_pointer = (char *)malloc(((length + 1) * sizeof(char)) / 2 - 1);

这是它唯一完美运作的情况。

get_number()函数很好,它只是确保您将键入一个 int 类型。

void main() {
char *ch_pointer = '';
int length = 0;
printf("Please write down your sentence length in characters (including spaces): ");
length = get_number();
ch_pointer = (char *)malloc(((length + 1) * sizeof(char)) / 2 - 1); 
ch_pointer[strlen(ch_pointer) - 1] = '';
printf("Please write down your sentence: ");
for (int filling = 0; filling < strlen(ch_pointer); filling++)
scanf(" %c", &ch_pointer[filling]);
for (int printing = 0; printing < strlen(ch_pointer); printing++)
printf("%c", ch_pointer[printing]);
free(ch_pointer);
}

如果我写下4甚至100,以获得以''结尾的数组长度5101,并且让我完美地键入和打印,则两个编译器的工作方式相同:

length = 4
strlen(ch_pointer) == 4

length = 100
strlen(ch_pointer) == 100

这里有一个根本的误解:strlen对你传入的数组的分配大小一无所知;它只是遍历它,直到它找到一个空字符,并返回它必须跳过的字符数。

由于malloc返回指向未初始化内存的指针,其内容是不可预测的,因此调用strlen是未定义的行为 - 在内存块中没有零的最坏情况下,它甚至会继续读取它之外,希望使程序崩溃。

问题是,malloc()返回一个指向分配内存的指针,其内容是不确定的。

引用C11,第7.22.3.4章

malloc函数为大小由size和 其价值是不确定的。

也就是说,对于第 7.24.6.3 章strlen()

strlen函数计算s指向的字符串的长度。

strlen函数返回终止 null 前面的字符数 字符。

因此,strlen()专家将参数设置为字符串

现在,根据定义,malloc()返回的指针指向的内存不能保证内存中的任何位置都存在空终止符。因此,您不能在此上运行strlen()。您很可能会通过内存溢出来调用未定义的行为。

相关内容

  • 没有找到相关文章

最新更新