2015-02-26 1 views
1

Я пишу программу C для отображения слов на светодиодной доске объявлений.C - Segfault на петле над 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 != '\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); 
} 

Кто-то может объяснить мне, почему это добавить?

Благодаря

+1

Это 'printf ("% p \ n ", p);' предназначено? Кроме того, убедитесь, что ваши указатели не являются 'NULL' перед разыменованием. –

+2

, пожалуйста, сделайте обработку ошибок для возврата из функции 'shmat'. Проверьте, имеет ли ваша строка нулевой ограничитель. –

ответ

1

Я предполагаю, что вы бежите из вашего адресного пространства процесса. Вы постоянно подключаете общую память, что делает OS выбранным местом для другого приложения, но вы никогда не отсоединяете общий регион.

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); 
} 

Спасибо за вашу помощь!

 Смежные вопросы

  • Нет связанных вопросов^_^