c-写入共享内存核心转储分段错误



我需要写入共享内存,因此我有

#define FLAGS IPC_CREAT | 0644
int main() {
key = ftok("ex31.c", 'k');
shmid = shmget(key, 3, FLAGS);
shmaddr = shmat(shmid,0,0);    // THOSE LINES WORK AS EXPECTED
char* userInput = malloc(5);
read(0, userInput, 3);  // I want to read "b34" for example, WORKS GOOD
strcpy(shmaddr,userInput);   // THROWS EXCEPTION!
}

它在strcat中引发异常,如果我删除它,则在strcpy的下一行中引发异常。我需要写入内存"b34"(4个字符),然后读取它。

这:

strcat(userInput, '');   //THROWS EXCEPTION!!

不是有效的C,并且它不会"抛出异常",因为C没有异常。也许它崩溃了,但无论如何,这应该是意料之中的事,因为你甚至没有写有效的代码。使用这样一个拒绝明显无效代码的编译器。


编辑:和这个:

char* userInput = malloc(5);
read(0, userInput, 3);
strcpy(shmaddr,userInput);

无效,因为您读取了三个字符,使userInput中的最后两个字符未初始化,然后您调用strcpy(),它从userInput读取一个以null结尾的字符串,但您没有以null结尾该字符串,因此这是未定义的行为,任何事情都可能发生,包括崩溃。所以试试这个:

const size_t INPUT_MAX_SIZE = 3;
char userInput[INPUT_MAX_SIZE + 1];
read(STDIN_FILENO, userInput, INPUT_MAX_SIZE);
userInput[INPUT_MAX_SIZE] = ''; // add null terminator
strcpy(shmaddr,userInput);

或者更好:

read(STDIN_FILENO, shmaddr, INPUT_MAX_SIZE);

也就是说,只需直接读取到目的地,而不是临时缓冲区。

函数strcatstrcpy都希望参数是以null结尾的字符串,在这种情况下,userInputshmaddr都不满足这个条件,这就是为什么您会看到程序崩溃的原因。试试这个:

#define FLAGS IPC_CREAT | 0644
int main(void) {
    key = ftok("ex31.c", 'k');
    shmid = shmget(key, 4, FLAGS);  // the buffer needs at least size 4 to hold the 3 char string and the null terminator
    shmaddr = shmat(shmid, 0, 0);
    char* userInput = malloc(5);
    read(0, userInput, 3);
    userInput[3] = '';
    strcpy(shmaddr, userInput);
}

相关内容

  • 没有找到相关文章

最新更新