我可能会因为某种错误而使用我的读取功能,但我无法识别它。
#include <unistd.h>
#include <sys/sysinfo.h>
#include <sys/syscall.h>
void exitProgram()
{
syscall(SYS_write, 1, "norma", slen("norma"));
syscall(SYS_exit, 1 , 0);
}
int main()
{
func_desc arr[2];
int choice;
arr[0].name = "exit";
arr[0].func = &exitProgram;
syscall(SYS_write, 1, "Choose: ", slen("Choose: "));
syscall(SYS_read, 0, choice, sizeof(choice));
arr[choice-1].func();
return 0;
}
如果选择为'1'则应调用exitProgram(),而是调用Segmentation fault(core dumped)。当我写一个特定的数字然后它起作用(例子):
arr[0].func();
如何解决此分段错误(核心转储)问题?
答案 0 :(得分:0)
#include <unistd.h>
#include <sys/sysinfo.h>
#include <sys/syscall.h>
#include <string.h>
void exitProgram()
{
syscall(SYS_write, 1, "norma", strlen("norma"));
syscall(SYS_exit, 1 , 0);
}
typedef struct func_desc {
char const *name;
void (*func)(void);
} func_desc;
int main()
{
func_desc arr[2];
char choice;
arr[0].name = "exit";
arr[0].func = &exitProgram;
syscall(SYS_write, 1, "Choose: ", strlen("Choose: "));
syscall(SYS_read, 0, &choice, sizeof(choice));
arr[choice-'0'-1].func();
return 0;
}
这样可行(仅当您输入数字1时才正确)。
read
采用以下参数:
ssize_t read(int fd, void *buf, size_t count);
使用这个glibc read
包装器可能是明智的(它肯定会阻止你传递一个指向预期的int)。