2017-02-26 54 views
0

我鍵入下面的代碼的方法的錯誤:實驗以創建一個字符串進行字符指針但

#include <stdio.h> 

int main() 
{ 
    printf("Hello, World!\n"); 

    char *S ,g; 

    g= 'p'; 

    S = &g; 
    char *n; 
    *(S+1)= 'V'; 
    printf("The output is %s ",S); 

    return 0; 
} 

我想看到什麼是如果我帶的「S」增值1並將字符V賦值給它,然後將它作爲字符串的名稱來處理指針「S」? (有可能)?

什麼我正在爲輸出是: 輸出爲(空)

任何建議和見解?

+4

Agnivesh,閱讀有關'char'數據類型和C中字符串('char'數組)之間的區別。 –

回答

2
*(S+1)= 'V'; 

S是你設置爲g地址,後者持有 char足夠的內存char*。你正在訪問你的程序無權訪問的內存(見底部),所以行爲是未定義的。如果您在編譯時不知道char*字符串的長度,則需要使用malloc()或其變體爲您的可變長度字符串分配內存。

size_t N = 64; // if your string is 63 characters -- you need the 64th for the null terminator 
char* str = malloc(N * sizeof(*str)); 

或者,使用靜態char陣列恆定的最大尺寸,並從那裏走。

#define MAX_SIZE 64 
... 
char buff[MAX_SIZE]; 
  • 訪問無權:你不應該訪問,你有沒有保留的內存區域。 g擁有足夠的空間用於一個字符。 *(S+1)= 'V';試圖在保留一個char的內存區域之外放置一個字節的char,因此該程序可能正在訪問其他任何浮動內存的內存;這可能會導致崩潰。
+0

「程序無權訪問」是什麼意思? –

+0

@AgniveshSingh內存地址'S + 1'指向沒有被你的程序分配 - >你正在寫入內存,你沒有權限訪問,調用*未定義的行爲* – UnholySheep

+0

@AgniveshSingh看到我上面添加的解釋和UnholySheep的解釋。 – synchronizer