簡體   English   中英

Shell C中的動態分配和分段故障

[英]Dynamic allocation and Segmentation fault in shell C

我想為行和argv動態分配內存,並在需要時重新分配,但是當我這樣做時出現錯誤:

char* argv = malloc(sizeof(char)*BUFFER); 賦值使指針產生整數,而無需像strcmp這樣的許多行進行強制轉換。 錯誤日志: https : //i.imgur.com/qsYNinq.jpg

另外,當有人按ENTER鍵時,我也希望它不打印$(space),但是我得到分段錯誤(轉儲了內核)或沒有代碼scanf("%s",line); if(line == "\\n") printf("$ "); scanf("%s",line); if(line == "\\n") printf("$ ");

提前致謝。

如果這

char* argv = malloc(sizeof(char)*BUFFER);

導致賦值使指針的整數變成整數而沒有強制轉換警告,則您正在編譯的實際代碼可能會丟失

#include <stdlib.h>

文件開頭的指令。 GCC仍然實現隱式函數定義(已從C標准中刪除了很長時間),因此它會自動提供malloc的聲明,如下所示:

int malloc();

但這定義在64位體系結構上是沒有用的,因為它會裁剪指針值的高32位(將返回值廣播回char *不會恢復它們)。

當前版本的GCC會警告缺少malloc聲明。 您確實應該使用-Wall進行編譯以獲取此警告(較早的GCC版本默認未啟用該警告)。

在當前代碼中, argv是一個指針數組,但是它建議的代碼是char* argv = malloc(sizeof(char)*BUFFER); 它變成一個字符數組。

當您稍后嘗試執行argv[i]=token; ,您嘗試將一個指針( token )分配給一個純字符,這會導致警告分配使指針從指針變為整數而不進行強制轉換

正確的方法是讓argv仍然是指向指針的指針:

int cmd_argc = 10;
char **argv = malloc(cmd_argc * sizeof(char *));

如果以后需要在argv數組中使用更多參數,則可以重新分配:

cmd_argc *= 2;
if (NULL == realloc(argv, cmd_argc * sizeof(char *))) {
    // memory allocation error
    ...
}

但是按照慣例argcargv用於當前程序的參數,因此您應該使用另一個名稱,例如cmd_argv

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM