【发布时间】:2016-03-10 01:48:30
【问题描述】:
有人知道我为什么会收到“分段错误(核心转储)”消息吗?怎么了?在我看来,问题出在数组上。我知道“分段错误”意味着我试图访问我无权访问的内存。
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, const char* argv[])
{
int shmid;
int i, j;
int glos;
pid_t pid;
key_t key;
long *wyniki;
key = ftok("/home/sebastian", 2);
shmid = shmget(key, 20 * sizeof(long), IPC_CREAT);
if (shmid == -1) {
printf("Error - New memory segment");
}
else {
printf("My memory segment: %d\n", shmid);
wyniki = (long*) shmat(shmid, 0, 0);
for (i = 0; i < 5; i++) {
wyniki[i] = 0;
}
// Creating new processes
for (i = 0; i < 20; i++) {
pid = fork();
if (pid == 0) {
srand48(time(NULL) + getpid());
for (j = 0; j < 1000000; j++) {
glos = rand() % 5;
wyniki[glos] += 1;
}
}
else {
printf("ERROR - PROCESSES");
}
}
}
return 0;
}
【问题讨论】:
-
你用过gdb吗?段错误之前的变量值是多少?
ftok成功了吗?你应该check its return value以防万一。 -
用 -g 编译程序,使用 gdb 运行它,这将显示它失败的行
-
ftok不返回 -1。 -
你#include了哪些头文件?
-
调试器说 ftok 中没有这样的文件或目录。另外,当我想重置数组
wyniki时会引发分段错误
标签: c unix gcc segmentation-fault