我有一个结构
struct services {
char *actived[50];
char *disactived[50];
};
和一个功能:
void servicesInfo(struct services *services_i) {
FILE *fp;
int status;
char *tmp;
const char *actived_cmd ="/usr/sbin/service --status-all | awk '/[+]/{ print $4 }'" ;
fp = popen(actived_cmd, "r");
int i=0;
while (fgets(tmp, 1024, fp)){
printf("service %s\n", tmp);
(services_i->actived)[i]=tmp;
i++;
}
status = pclose(fp);
}
当我调用函数
时 struct services services_i;
servicesInfo(&services_i);
一切都很好并打印了所有服务,但是如果这个代码
for (i = 0; i < 20; ++i)
{
printf("service i=%d %s\n",i,services_i.actived[i] );
}
只打印最后一个值(uvrandom)
答案 0 :(得分:1)
以下是如何为结构赋值的示例代码:
#include <stdio.h>
struct date { /* global definition of type date */
int month;
int day;
int year;
};
main()
{
struct date today;
today.month = 10;
today.day = 14;
today.year = 1995;
printf("Todays date is %d/%d/%d.\n", \
today.month, today.day, today.year );
}
答案 1 :(得分:1)
您需要阅读C指针和内存分配。这里有两个误解:
tmp
不是字符串缓冲区。它只是一个字符串指针。它只能被指定为指向在其他地方分配的字符串,而不包含字符串本身。actived
(顺便说一下,这可能应拼写为activated
)。这意味着所有actived
指针都指向与tmp
相同的指针,它总是相同的,因为tmp永远不会改变(并且还具有未初始化的值)。我建议你使用tmp = malloc(1024)
。当你不再需要它时,不要忘记使用free(services_i.actived[i])
。
我还建议创建一个结构数组而不是数组结构,以使其更符合逻辑。