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);
}
感谢您的帮助!
我写了一个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);
}
感谢您的帮助!