我在哪里访问非法内存? realloc(): 下一个大小无效
Where am I accessing illegal memory? realloc(): invalid next size
我正在为操作系统课程作业制作一个 shell 模拟器。
我们被要求添加一个“历史”命令,当输入时,应该打印用户输入的命令列表。
我决定使用历史数组来实现它,该数组根据新命令的大小动态分配更多内存。
这是我的代码:
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#define BUFFER_SIZE 100
//comment
int main(void)
{
close(2);
dup(1);
char command[BUFFER_SIZE];
char* hist = NULL;
// int counter = 0;
while (1)
{
fprintf(stdout, "my-shell> ");
memset(command, '[=10=]', BUFFER_SIZE);
fgets(command, BUFFER_SIZE, stdin);
if(strncmp(command, "exit", 4) == 0)
{
break;
}
//alocate memory for the current position in the hist array
if(hist == NULL){
hist = (char*)malloc(sizeof(char)*strlen(command));
}
else{
hist = realloc(hist,sizeof(char)*strlen(command));
}
strcat(hist,command);
printf("the size of the boy: %d\n",(int) strlen(hist));
// counter += strlen(command);
int pid = fork();
char *argv[BUFFER_SIZE];
char *pch;
pch = strtok(command, " \n");
int i;
for(i=0; pch != NULL; i++){
argv[i] = pch;
pch = strtok(NULL, " \n");
}
argv[i] = NULL;
int hasAmpersand = 0;
//check if the last entered character was '&'
if(*argv[i-1]=='&'){
// printf("entered &:");
hasAmpersand = 1;
//replace it with '[=10=]'
argv[i-1] = NULL;
}
if(pid == 0){ //child process execute sys call
if(strncmp(argv[0],"history",7) == 0){
printf("%s\n", hist);
exit(1);
}
else{
execvp(argv[0], argv);
printf("\nbad syntax\n");
}
}
else{
if(!hasAmpersand){ //wait for child
while(wait(NULL) != pid);
}
}
}
free(hist);
return 0;
}
该实现适用于存储在 hist 中的最多 6 个命令,但因错误而崩溃
realloc(): invalid next size
aborted
我想知道是什么原因导致了这个问题,我很乐意提供解决问题的建议。谢谢
您需要为尾随字符串终止符 '[=11=]'
留出空间,因此将分配的大小加一:
hist = malloc(sizeof(char)*strlen(command) + 1);
realloc 的参数也需要调整。此外,您可能希望在调用 fgets.
后删除尾随的换行符
realloc 的第二个参数应该是整个块的新大小,而不仅仅是“添加”到内存区域的数据大小。
hist = realloc(hist, currentHistSize + sizeof(char)*strlen(command));
确保根据需要命名 currentHistSize。
我正在为操作系统课程作业制作一个 shell 模拟器。 我们被要求添加一个“历史”命令,当输入时,应该打印用户输入的命令列表。
我决定使用历史数组来实现它,该数组根据新命令的大小动态分配更多内存。
这是我的代码:
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#define BUFFER_SIZE 100
//comment
int main(void)
{
close(2);
dup(1);
char command[BUFFER_SIZE];
char* hist = NULL;
// int counter = 0;
while (1)
{
fprintf(stdout, "my-shell> ");
memset(command, '[=10=]', BUFFER_SIZE);
fgets(command, BUFFER_SIZE, stdin);
if(strncmp(command, "exit", 4) == 0)
{
break;
}
//alocate memory for the current position in the hist array
if(hist == NULL){
hist = (char*)malloc(sizeof(char)*strlen(command));
}
else{
hist = realloc(hist,sizeof(char)*strlen(command));
}
strcat(hist,command);
printf("the size of the boy: %d\n",(int) strlen(hist));
// counter += strlen(command);
int pid = fork();
char *argv[BUFFER_SIZE];
char *pch;
pch = strtok(command, " \n");
int i;
for(i=0; pch != NULL; i++){
argv[i] = pch;
pch = strtok(NULL, " \n");
}
argv[i] = NULL;
int hasAmpersand = 0;
//check if the last entered character was '&'
if(*argv[i-1]=='&'){
// printf("entered &:");
hasAmpersand = 1;
//replace it with '[=10=]'
argv[i-1] = NULL;
}
if(pid == 0){ //child process execute sys call
if(strncmp(argv[0],"history",7) == 0){
printf("%s\n", hist);
exit(1);
}
else{
execvp(argv[0], argv);
printf("\nbad syntax\n");
}
}
else{
if(!hasAmpersand){ //wait for child
while(wait(NULL) != pid);
}
}
}
free(hist);
return 0;
}
该实现适用于存储在 hist 中的最多 6 个命令,但因错误而崩溃
realloc(): invalid next size
aborted
我想知道是什么原因导致了这个问题,我很乐意提供解决问题的建议。谢谢
您需要为尾随字符串终止符 '[=11=]'
留出空间,因此将分配的大小加一:
hist = malloc(sizeof(char)*strlen(command) + 1);
realloc 的参数也需要调整。此外,您可能希望在调用 fgets.
后删除尾随的换行符realloc 的第二个参数应该是整个块的新大小,而不仅仅是“添加”到内存区域的数据大小。
hist = realloc(hist, currentHistSize + sizeof(char)*strlen(command));
确保根据需要命名 currentHistSize。