我有一个启动rtsp服务器的小代码。启动特定服务器后,我将有关服务器的信息添加到服务器,例如其处理器ID(因为我将每个服务器作为子进程启动),它具有哪种源,端口和安装点名称到我称为rtsp_server_list
的结构数组中。我在代码开头有一个static int server_count = 1
,每当我添加新服务器时,它都会增加 1。所以我的add_server()
函数如下:
struct rtsp_server_list* add_server() {
char *port, *mountName, *source;
pid_t child_process_id;
printf("Server count: %dn", server_count);
struct rtsp_server_list *server = malloc(server_count*sizeof(struct rtsp_server_list));
printf("Size of server list: %lun", sizeof(server));
source = malloc(256);
port = malloc(256);
mountName = malloc(256);
g_print("Enter a source: ");
scanf("%255s", source);
g_print("Enter a port: ");
scanf("%255s", port);
g_print("Enter a mount name: ");
scanf("%255s", mountName);
child_process_id = fork();
if (child_process_id < 0) {
perror("Fork for child failed.n");
} else if (child_process_id == 0) {
g_print("Child process... n");
execl("/home/tunc/workspace/gstreamer_rtsp_server/Debug/gstreamer_rtsp_server", "/home/tunc/workspace/gstreamer_rtsp_server/Debug/gstreamer_rtsp_server", source, port, mountName, NULL);
} else {
g_print("Child created, child is running.n");
}
server[server_count-1].source = strdup(source);
server[server_count-1].mountName = strdup(mountName);
server[server_count-1].port = strdup(port);
server[server_count-1].process_id = child_process_id;
server_count++;
// wait a bit to not mess the console outputs.
sleep(1);
return server;
}
在上面的代码中,*server
的大小永远不会改变,它始终保持在 8 个字节。但是当我添加服务器时server count
会增加 1,所以如果我碰巧添加第二个服务器,*server
的大小应该为 16。是因为我没有为结构中的char
数组分配内存吗?我的结构如下:
struct rtsp_server_list {
char *source;
char *mountName;
char *port;
pid_t process_id;
} rtsp_server_list;
我还有一个代码,可以通过终止其进程来删除 rtsp 服务器,但我也无法以我想要的方式更新列表。那么我做错了什么?我尝试用realloc
做这些,但结果完全相同。
sizeof(server)
将给出指针的大小,而不是数组的总大小。
它依赖于实现(在您的情况下为 8 个字节)