C - 在 char * 循环上出现段错误

C - Segfault on a loop over char *

我写了一个C程序在led留言板上显示一个字。

我遍历包含我的消息的 char*,经过一些处理后,我给出了一个段错误。

我已经在这段代码中找出了我的问题(segfault 出现在 scrollMsg() 函数上):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>

#define SHM_SIZE 1024

void setMsg()
{
    key_t key;
    int shmid;
    char *data;

    key = ftok("my_test_key", 'R');
    shmid = shmget(key, SHM_SIZE, 0644 | IPC_CREAT);
    data = shmat(shmid, (void *)0, 0);

    strncpy(data, "TEST", SHM_SIZE);
}

char * getMsg()
{
    key_t key;
    int shmid;
    char *msg;

    key   = ftok("my_test_key", 'R');
    shmid = shmget(key, SHM_SIZE, 0644 | IPC_CREAT);
    msg   = shmat(shmid, (void *)0, 0);

    return msg;
}

void scrollMsg(char *buf)
{
    char *p = NULL;
    for (p=buf; *p != '[=10=]'; p++) {
        printf("%p\n", p);
    }
}

int main (int argc, char **argv) {
    char *msg = NULL;

    setMsg();

    do {
        msg = getMsg();

        printf("%s\n", msg);

        scrollMsg(msg);
    } while(1);
}

谁能解释一下为什么要追加?

谢谢

我的猜测是您的进程地址 space 中有 运行。您一直在附加共享内存,使得 OS 为另一个附件选择了另一个位置,但您永远不会分离共享区域。

我的错,你是对的。

这是一个工作代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>

#define SHM_SIZE 1024

void setMsg()
{
    key_t key;
    int shmid;
    char *data;

    key = ftok("test_key", 'R');
    shmid = shmget(key, SHM_SIZE, 0644 | IPC_CREAT);
    data = shmat(shmid, (void *)0, 0);

    strncpy(data, "TEST", SHM_SIZE);
}

char * getMsg()
{
    key_t key = 0;
    int shmid = 0;
    char *msg = NULL;

    key   = ftok("test_key", 'R');
    shmid = shmget(key, SHM_SIZE, 0644 | IPC_CREAT);
    msg   = shmat(shmid, (void *)0, 0);

    return msg;
}

void scrollMsg(char *buf)
{
    char *p = NULL;
    for (p=buf; *p != '[=10=]'; p++) {
        printf("%p\n", p);
    }
}

int main (int argc, char **argv) {
    char *msg = NULL;

    setMsg();

    msg = getMsg();

    do {
        printf("msg:%s\n", msg);

        scrollMsg(msg);
    } while(1);
}

感谢您的帮助!