我從來沒有真正做過多C,但我開始玩弄它。我正在寫下面的小片段,試圖理解C語言中關鍵結構/函數的用法和行爲。下面我寫了一個試圖理解char* string
和char string[]
之間的區別以及字符串長度如何工作的區別。此外,我想看看是否可以使用sprintf
連接兩個字符串並將其設置爲第三個字符串。我是C新手,有人可以解釋爲什麼這個字符串的大小可以改變嗎?
我發現的是,我用來存儲其他兩個連接的第三個字符串必須使用char string[]
語法來設置,否則二進制文件將會與SIGSEGV (Address boundary error)
一起死亡。使用數組語法設置它需要一個大小,所以我最初通過將其設置爲其他兩個字符串的組合大小來開始。這似乎讓我足夠好地進行連接。
出於好奇,我嘗試將「連接」字符串擴展爲比我分配的大小更長。令我驚訝的是,它仍然有效,並且字符串大小增加了,並且可能是printf
'很好。
我的問題是:爲什麼會發生這種情況,它是無效的還是有風險/缺點?此外,爲什麼char str3[length3]
有效,但當sprintf
行嘗試執行時,char str3[7]
會導致「SIGABRT(中止)」?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main() {
char* str1 = "Sup";
char* str2 = "Dood";
int length1 = strlen(str1);
int length2 = strlen(str2);
int length3 = length1 + length2;
char str3[length3];
//char str3[7];
printf("%s (length %d)\n", str1, length1); // Sup (length 3)
printf("%s (length %d)\n", str2, length2); // Dood (length 4)
printf("total length: %d\n", length3); // total length: 7
printf("str3 length: %d\n", (int)strlen(str3)); // str3 length: 6
sprintf(str3, "%s<-------------------->%s", str1, str2);
printf("%s\n", str3); // Sup<-------------------->Dood
printf("str3 length after sprintf: %d\n", // str3 length after sprintf: 29
(int)strlen(str3));
}
我有一對夫婦在我身邊:) - 我喜歡試驗,但 - 如果我很好奇如何工作,我會盡力找出答案。另外,雖然我感謝你推薦學習C的方法,但這並沒有真正回答這個問題...... – 2009-09-07 11:51:30