我试图将一个字符串数组声明到共享内存中。 server.c 创建共享内存,client.c 填充数组“tab”并打印它。它在客户端工作得很好。 但我在运行 server.c 时收到垃圾字符!
如有任何帮助,我们将不胜感激!
服务器.c
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
typedef struct People
{
char *tab[5];
} Person;
int i;
int main()
{
system("clear");
Person aaron;
Person *p_aaron;
int id;
int key = 12345;
p_aaron = &aaron;
if ((id = shmget(key,1000, IPC_CREAT | 0666)) < 0)
{
perror("SHMGET");
exit(1);
}
printf("server: size: %d \n", sizeof(aaron));
if((p_aaron = shmat(id, NULL, 0)) == (Person *) -1)
{
perror("SHMAT");
exit(1);
}
for(i=0;i<5;i++) {
printf("server tab: %s \n", p_aaron->tab[i]);
}
return 0;
}
client.c
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <string.h>
typedef struct People
{
char *tab[5];
} Person;
int test;
int i;
int main()
{
system("clear");
Person aaron;
Person *p_aaron;
int id;
int key = 12345;
p_aaron = &aaron;
id = shmget(key,1000, IPC_CREAT | 0666);
p_aaron = shmat(id, NULL, 0);
p_aaron->tab[0]="abnb";
p_aaron->tab[1]="b";
p_aaron->tab[2]="c";
p_aaron->tab[3]="d";
p_aaron->tab[4]="e";
for(i=0;i<5;i++) {
printf("client tab: %s \n", p_aaron->tab[i]);
}
return 0;
}
server.c 输出
server tab: �
server tab: �
server tab: �
server tab: �
server tab: �
client.c 输出
client tab: abnb
client tab: b
client tab: c
client tab: d
client tab: e
最佳答案
用于初始化指针的文字字符串不在共享内存中,并且对服务器不可见。最简单的解决方案是声明一个字符串数组 char tab[5][MAXLEN]
并使其共享(MAXLEN 是最长元素的长度 + 1)。
关于C:打印共享内存中声明的数组时获取垃圾字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41538980/