假設我有一個char * str,並且我希望使用指針並遞增來逐個分配字符?使用指針將字符賦給char *
我做:
char *str;
char c = 'a';
*str++ = c;
但它不工作。
我該怎麼做?
假設我有一個char * str,並且我希望使用指針並遞增來逐個分配字符?使用指針將字符賦給char *
我做:
char *str;
char c = 'a';
*str++ = c;
但它不工作。
我該怎麼做?
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;
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
陣列中獲得更多或更少的空間以前的方法。
但它不起作用。
char* str;
...未初始化任何東西,因此取消引用它是不確定的行爲。如果它已初始化,則在表達式*str++ = c;
中,str ++是後增加運算符,它在返回指針副本的同時遞增原始數據。結果是副本指向前一個,因此前一個指針指向的內容被分配給c。
你指的是哪部分不起作用?
編輯:
正如在評論中提及了,是不是真的返回一個副本,但已被評估後的價值增值到位。
它不會「返回副本」。 '++'操作符修改對象(在這裏是指針)。它*在*遞增前評估*值*。 –
@FelixPalmen,在內建類型的情況下,這是真的,是的,但我想概念化是通過解釋它爲非內置的 –
這是C.沒有(用戶)重載操作符。 –
作爲具有自動存儲持續時間的變量,指針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
這裏是一個函數的一種證明,拷貝包含字符串轉換成使用指針另一個字符陣列的一個字符陣列。
做什麼?你知道嗎?爲什麼它不起作用? –
它不起作用,因爲'str'指向沒有確定。那裏沒有「那裏」。 – WhozCraig
我喜歡*的結構*沒有「那裏」*句子... –