2015-05-13 57 views
1

我有這樣的代碼在一個函數在C:strcat()在什麼情況下(如果曾經)掛起?

char* root = "/home/OS/homework/user/honorsupgrade/HTML"; 
requestInfo->resource = "/bing" 
printf("1\n"); 
int counter = 0; 
for(counter = 0; counter < 100; counter++) 
{ 
    if(root[counter] == '\0') 
    { 
     printf("True1\n"); 
     break; 
    } 
} 
for(counter = 0; counter < 100; counter++) 
{ 
    if(requestInfo->resource[counter] == '\0') 
    { 
     printf("True2\n"); 
     break; 
    } 
} 
printf("2\n"); 
fflush(stdout); 
strcat(root, requestInfo->resource); 
printf("3\n"); 
fflush(stdout); 
return open(root, 0_RDONLY); 

...

索取信息的東西,需要

struct ReqInfo 
{ 
    char *resource; 
} 

我在C創建了兩個字符串(字符指針) ,但由於某些原因,當我將這些方法傳遞給strcat()時,strcat()永遠不會返回。這會導致程序掛起。我已經測試過,以確保兩個字符串都有空終止符(所以strcat不是試圖連接超過它應該)。該程序將打印1和2,但從不打印3,這意味着它永遠不會通過strcat()調用,因爲我沖洗緩衝區以確保沒有問題。 \

編輯:我創建的代碼塊外的結構,我有一個char *資源更換時「requestInfo->資源」得到同樣的問題,並使其成爲「/冰」

+0

您需要爲ReqInfo結構的'resources'字段分配內存,因此您需要爲char聲明的'root'變量編寫'char resource [MAXRESOURCE]'(或者用malloc進行分配)。 – stackptr

回答

1

試圖寫入到const char *

即使char* rootchar *,它確實指向一個const char *。寫到這是未定義的行爲。

char* root = "/home/OS/homework/user/honorsupgrade/HTML"; 
.... 
strcat(root, requestInfo->resource); 

代碼應該分配一個正確大小的工作緩衝區。

char buffer[1000]; 
strcpy(buffer, root); 
strcat(buffer, requestInfo->resource); 
2

調用未定義的行爲原則上可能導致任何事情,其中​​包括掛起您的程序。當您將指針傳遞給字符串文字作爲strcat的目標時,您會調用未定義的行爲。

// root points to a string literal. This is immutable! 
char* root = "/home/OS/homework/user/honorsupgrade/HTML"; 

.... 

// Oops! Writing to *root is undefined behaviour! 
strcat(root, requestInfo->resource); 
1

您正試圖修改不斷字符串。聲明

char* root = "/home/OS/homework/user/honorsupgrade/HTML"; 

樹立root指針指向包含您的路徑不斷字符串。 root指向的內存不得修改,並且這樣做會調用未定義的行爲。對strcat()的調用嘗試修改常量字符串數據末尾的數據。這聽起來像編譯器把重要的東西放在那裏,然後你重寫了它。

0

在C程序員控制和負責內存分配。因爲您要求「strcat」(請參閱​​「man strcat」)將某些東西複製到一個不保留的位置(內存的末尾由''指向的字符串佔據'''''''''''''''''''''''''''''''''''''''''''''')根')。

這是很難說什麼你真正想做的事,但只是爲了避免撞車,你應該:

char[<static_buffer_lenght>] root = ... 
... 
strncat(root, <something>, sizeof(root) - strlen(root) - 1) 

這將使你的程序稍大,或:

char *root = (char *)malloc(<size_of_dynamic_buffer>) 
bzero((void *)root, <size_of_dynamic_buffer>) 
if (!root) { <handle memory error here> } 
... 
strncat(root, <something>, <size_of_dynamic_buffer> - strlen(root) - 1) 

這會讓你的程序稍微慢一些

有一段時間沒有使用'C',所以一些細節會導致編譯警告('<','>'以適當的文本替換 - 當然)。

相關問題