2012-06-22 109 views
1

我正在向函數傳遞char **類型的雙指針。在該函數內部,我需要取消引用指針,然後通過字符數組索引。解引用雙指針並使用索引運算符

不幸的是,當我嘗試將大寫字母分配回數組時,我得到了一個核心轉儲。

我需要關於如何做到這一點的幫助。 (這不是功課,只是一個個人項目。)

void buffer(char **ppline); 

int main() 
{ 
    char *line="The redcoats are coming!"; 

    buffer(&line); 
    printf("\nline = %s\n",line); 

    return(0); 
} 


void buffer (char **ppline) 
{ 

int i=0; 
char a; 

    for (i=0; i < strlen(*ppline); i++) 
    { 
    a = toupper((*ppline)[i]); /* THIS LINE CAUSES THE CORE DUMP */ 
    ((*ppline)[i]) = a; 
    } 

    return; 
} 

回答

2

字符串文字在""是恆定的。你不能修改它,因爲這是未定義的行爲。嘗試此,其分配存儲和複製字符串文字進去:

void buffer(char **ppline); 

int main() 
{ 
    char line[] = "The redcoats are coming!"; 

    buffer(&line); 
    printf("\nline = %s\n",line); 

    return(0); 
} 


void buffer (char **ppline) 
{ 

int i=0; 
char a; 

    for (i=0; i < strlen(*ppline); i++) 
    { 
    a = toupper((*ppline)[i]); /* THIS LINE CAUSES THE CORE DUMP */ 
    ((*ppline)[i]) = a; 
    } 

    return; 
} 
1

堆棧,堆,數據段(和BSS)和文本segement是處理存儲器的四個區段。所有定義的局部變量都將處於堆棧狀態。使用malloc和calloc動態分配內存將堆在一起。所有的全局變量和靜態變量都在數據段中。文本段將具有程序的彙編代碼和一些常量。

在這4個段中,文本段是READ ONLY段,其他三個段是READ和WRITE。

char []a="The redcoats are coming!"; - 此statemnt將爲堆棧中的25個字節分配內存(因爲是局部變量),並且它會在所有24個字符加上NULL字符(\ 0)。

char *p="The redcoats are coming!"; - 該語句將爲堆棧中的4個字節(如果它是32位機器)分配內存(因爲這也是一個局部變量),並且它將保存常量字符串的指針,其值爲「The redcoats is未來!」。這個常量字符串的字節將在文本段中。這是一個恆定的價值。指針變量p只是指向那個字符串。

現在a[0](索引可以是0到24)表示它將訪問處於堆棧中的字符串的第一個字符。所以我們也可以在這個位置寫作。 a[0] = 'x'允許執行此操作,因爲我們在堆棧中具有讀寫權限。

但是p[0] = 'x'會導致崩潰,因爲我們只有讀權限的文本segement。如果我們對文本段進行任何寫入,將會發生分段錯誤。

但是你可以改變變量p的值,因爲它的局部變量在堆棧中。如下所示

char *p = "string"; 
printf("%s", p); 
p = "start"; 
printf("%s", p); 

這是允許的。在這裏,我們將存儲在指針變量p中的地址更改爲字符串開始的地址(再次啓動也是文本段中的只讀數據)。如果你想修改* p中的值,就意味着去動態分配內存。

char *p = NULL; 
p = malloc(sizeof(char)*7); 
strcpy(p, "string"); 

現在p[0] = 'x'允許操作,因爲現在我們正在寫入堆。