2017-10-05 162 views
-2

假設我有一個char * str,並且我希望使用指針並遞增來逐個分配字符?使用指針將字符賦給char *

我做:

char *str; 
char c = 'a'; 
*str++ = c; 

但它不工作。

我該怎麼做?

+0

做什麼?你知道嗎?爲什麼它不起作用? –

+4

它不起作用,因爲'str'指向沒有確定。那裏沒有「那裏」。 – WhozCraig

+2

我喜歡*的結構*沒有「那裏」*句子... –

回答

3

str只是一個指針。它沒有指向任何有效的地方(尤其是不能指向你可以寫入的某些內存)。一個簡單的可能性是把它指向的數組:

char buf[1024] = {0}; // room for 1024 chars (or 1023 + a 0 byte for a string) 
char *str = buf; 
char c = 'a'; 
*str++ = c; 
2

char *str是指向一個char(或字符數組),然而,就從未分配它。如前所述,char *基本上說「去那裏」,但那裏沒有,你從來沒有給它一個價值。首先,您需要使用malloc創造空間放東西的。這裏有一個例子

char *str = malloc(sizeof(char)*10) //allocate space for 10 chars 
char c = 'a'; 
str[0] = c; 

沒有錯誤檢查是對malloc,你應該在自己的程序做製造。你也可以做這樣

char str[10]; 
char c = 'a'; 
str[0] = c; 

但是用這種方法,你將被限制在10個字符,你不能改變的金額,你可以使用realloc陣列中獲得更多或更少的空間以前的方法。

1

但它不起作用。

char* str; 

...未初始化任何東西,因此取消引用它是不確定的行爲。如果它已初始化,則在表達式*str++ = c;中,str ++是後增加運算符,它在返回指針副本的同時遞增原始數據。結果是副本指向前一個,因此前一個指針指向的內容被分配給c。

你指的是哪部分不起作用?

編輯:

正如在評論中提及了,是不是真的返回一個副本,但已被評估後的價值增值到位。

+1

它不會「返回副本」。 '++'操作符修改對象(在這裏是指針)。它*在*遞增前評估*值*。 –

+0

@FelixPalmen,在內建類型的情況下,這是真的,是的,但我想概念化是通過解釋它爲非內置的 –

+0

這是C.沒有(用戶)重載操作符。 –

1

作爲具有自動存儲持續時間的變量,指針str具有不確定的值。如果它有靜態存儲持續時間,它的值將爲NULL。所以你可能不會使用這樣的指針來存儲數據。

你的意思是什麼可以期待例如通過以下方式

#include <stdio.h> 

int main(void) 
{ 
    char s[11]; 

    char *p = s; 

    while (p != s + sizeof(s)/sizeof(*s) - 1) *p++ = 'a'; 
    *p = '\0'; 

    puts(s); 

    return 0; 
} 

程序輸出是

aaaaaaaaaa 

在這裏,在節目類型char *的指針p由的地址初始化數組的第一個字符s

因此,在循環

*p++ = 'a'; 

使用該語句順序填充以字符'a'陣列。

下一個例子是更有趣

#include <stdio.h> 

char * copy_string(char *dsn, const char *src) 
{ 
    for (char *p = dsn; (*p++ = *src++) != '\0';) 
    { 
     // empty body 
    } 

    return dsn; 
} 

int main(void) 
{ 
    char *src = "Hi QBl"; 
    char dsn[7]; 

    puts(copy_string(dsn, src)); 

    return 0; 
} 

程序輸出是

Hi QBl 

這裏是一個函數的一種證明,拷貝包含字符串轉換成使用指針另一個字符陣列的一個字符陣列。