我正在使用我安装的gcc编译器,我从我的cmd运行(在编辑器中编写可视化代码)并且为了调试,我还安装了Visual studio。 这是我的第二个学期,我刚刚了解了malloc
/calloc
等。
所以行:
ch_pointer = (char *)malloc(length * sizeof(char));
在我的 GCC 编译器中,当我使用strlen(ch_pointer)
、2
或4
作为答案时,会给出回报。
如果我使用一个太大的数字(例如 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
,以获得以' '
结尾的数组长度5
或101
,并且让我完美地键入和打印,则两个编译器的工作方式相同:
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()
。您很可能会通过内存溢出来调用未定义的行为。