分配给结构成员的值不正确

时间:2016-02-06 20:58:19

标签: c

我有一个结构

 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)

2 个答案:

答案 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指针和内存分配。这里有两个误解:

    正如所写的那样,
  1. tmp不是字符串缓冲区。它只是一个字符串指针。它只能被指定为指向在其他地方分配的字符串,而不包含字符串本身。
  2. 您只是将指针复制到actived(顺便说一下,这可能应拼写为activated)。这意味着所有actived指针都指向与tmp相同的指针,它总是相同的,因为tmp永远不会改变(并且还具有未初始化的值)。
  3. 我建议你使用tmp = malloc(1024)。当你不再需要它时,不要忘记使用free(services_i.actived[i])

    我还建议创建一个结构数组而不是数组结构,以使其更符合逻辑。