[英]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
...
}
但是按照慣例 , argc
和argv
用於當前程序的參數,因此您應該使用另一個名稱,例如cmd_argv
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.