C - 关于char *循环的Segfault

时间:2015-02-26 13:40:00

标签: c pointers

我编写了一个C程序来显示led留言板上的文字。

我循环遍历包含我的消息的char *,经过几次处理后,我给出了段错误。

我在此代码中已经隔离了我的问题(段错误出现在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 != '\0'; 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);
}

有人可以解释为什么会追加这个?

由于

2 个答案:

答案 0 :(得分:1)

我的猜测是你已经用尽了你的进程地址空间。您经常附加共享内存,使操作系统为另一个附件选择另一个位置,但您永远不会分离共享区域。

答案 1 :(得分:0)

我的坏,你是对的。

这是一个有效的代码:

#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 != '\0'; 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);
}

感谢您的帮助!