C:打印共享内存中声明的数组时获取垃圾字符

标签 c arrays unix shared-memory

我试图将一个字符串数组声明到共享内存中。 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/

相关文章:

regex - 如何使用 sed、awk 或 gawk 只打印匹配的内容?

c - 使用eventfd同步时无法获取锁

c++ - 我可以在 C 或 C++ 中使用二进制文字吗?

在 C 中复制字符串(子字符串)的一部分

c - 文件无缓冲 I/O : Read and Write a String in C 的问题

python - 当我通过终端使用 VIM 时,我不断收到重复的文件,并在末尾附加了 ~。这些是什么?

c - 赋值从指针生成整数,无需在 C 中进行强制转换 [错误 : invalid initializer]

c# - C# 中的结构编码(marshal)

javascript - 使用 lodash 在 javascript 中查找两组数据之间的匹配

javascript - 合并数组,为什么我的输入数组发生了变化?