當我有一個未初始化的指針,我不能放入它,因爲沒有內存分配的地方!字符串與字符指針
當我有一個指針指向一個char類型的變量,並且我想用%s放入它時,程序會讓我放置兩個字符(2個字節),超出這個範圍會給我一個錯誤。
我的問題是爲什麼它可以放在兩個字母,當字符只能容納一個字節?該程序是否應該不會掉下兩個字母?
當我有一個未初始化的指針,我不能放入它,因爲沒有內存分配的地方!字符串與字符指針
當我有一個指針指向一個char類型的變量,並且我想用%s放入它時,程序會讓我放置兩個字符(2個字節),超出這個範圍會給我一個錯誤。
我的問題是爲什麼它可以放在兩個字母,當字符只能容納一個字節?該程序是否應該不會掉下兩個字母?
這可能與對齊有關。如果char變量後面有一個多字節類型,那麼它們之間可能會有少量未使用的字節,但您不能依賴它,因爲它顯然未定義。
我會建議使用valgrind
檢查內存問題,而不是根據觀察。
如果後面有一個多字節變量,那麼編寫兩個以上的字符只會覆蓋該變量的一部分,但不會導致崩潰。海事組織不是一個很可能的情況。 –
據我瞭解,這是未定義的行爲。寫入不指向已分配內存的指針可能會工作,或可能會崩潰。我會考慮代碼錯誤,即使它沒有崩潰的前兩個字符。
我認爲你的程序的行爲是由於你沒有初始化內存中任何地址塊的指針 。 默認情況下,指針可能有或沒有有效的內存地址。
試試這個:
#include<stdio.h>
#include<stdlib.h>
int main()
{
char *_str = malloc(x); // x is the number of bytes that you want to point to.
fgets(_str, x, stdin);
printf("\n_str = %s", _str);
return 0;
}
您可以發佈一個例子嗎?如果你調用未定義的行爲,當奇怪的事情發生時你不應該感到驚訝。 – Thanatos
Char只存儲一個字母。 – Igor
但'char *'通常指向一個緩衝區。所以我們需要更多的信息他在做什麼。他提到'%s',所以我假設正在使用'sprintf'。 –