Array typedef Struct не работает должным образом при вызове функцией - PullRequest
0 голосов
/ 10 января 2012

Я объявляю

typedef struct LABELS_STRUCT {
char *name;
int address;
} `LABELS_STRUCT;`

LABELS_STRUCT labels_array[ARRAY_LABELS];

и функцию, которая добавляет имя и адрес aray

int add_data_label(char * label, int displace) 
{
    LABELS_STRUCT x = {label,DATA_STARTING_ADDRESS + (100 * displace)};
    labels_array[initialize]=x;
    initialize++;//=initialize+displace;
    printf("\tAdding [%s] with offset [%d] to labels_array[%d] with address [%d]\n", label,displace,initialize,CODE_STARTING_ADDRESS + (100 * displace));
    printf("\tlabels_array[%d].name=[%s] and labels_array[%d].address= [%d]\n", initialize, labels_array[initialize].name, initialize, labels_array[initialize].address);   

    return 1;
}

Второй оператор printf() выводит данные правильно, но когда у меня естьдругая функция

int get_label_address(char *label) {
    int i;
    printf("Getting the Label Address for [%s]\n", label);
    for (i = 0; i < initialize; i++) {
        printf("\t\t\tCOMPARING LABEL [%s] TO [%s] at index [%d]\n", label, labels_array[i].name,i);
        if (labels_array[i].name==label) {
            printf("Label_Array[%d]=[%s] Matches label=[%s] with address [%d]\n",i,labels_array[i].name,label,labels_array[i].address);
            return labels_array[i].address;
        }
    }
    return 0;
}

Оператор debug printf() "COMPARING LABEL [%s] to [s]..." Loop показывает, что его сравнивают с null.Когда я использую любую другую функцию для печати элемента в labels_array[i].name, она дает мне пустое значение для элемента name, но не для элемента address.Допустим, у меня есть три элемента, которые я поместил в массив, labey_array[1 2 and 3] будет пустой строкой, но label_array[4 and on] будет иметь null.Таким образом, он знает, что он был инициализирован, но не показывает фактическое имя, просто пустую строку

У кого-нибудь есть идеи?

1 Ответ

1 голос
/ 10 января 2012

В функции add_data_label() вы должны сделать strcpy() из входящих char * label для LABELS_STRUCT 'char *name;.Вы также должны выделить память для name в LABELS_STRUCT x, используя malloc().

В основном вам нужно что-то вроде следующего:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct LABELS_STRUCT {
    char *name;
    int address;
} LABELS_STRUCT;

#define ARRAY_LABELS 10

LABELS_STRUCT labels_array[ARRAY_LABELS];
int labels_array_index;

int add_data_label(char * label, int displace) 
{  
    int len = strlen(label);
    printf("len = %d \n", len);

    if ((labels_array[labels_array_index].name = (char *) malloc(sizeof(char) * len + 1)) == NULL) {
        printf("unable to allocate memory \n");
        return -1;
    }
    strcpy(labels_array[labels_array_index].name, label);
    printf("name = %s \n", labels_array[labels_array_index]);

    labels_array[labels_array_index].address = displace;
    labels_array_index++;
    /* here you can copy displace to LABELS_STRUCT's address */
}  

int main(void)
{  
    labels_array_index = 0;
    add_data_label("abc", 19);
    return 0;
}

Несколько баллов дляПРИМЕЧАНИЕ:

  • Вы должны free() всю malloc() 'ed память.Таким образом, по аналогии с add_data_label() у вас должно быть delete_data_label(), где вы вызываете free() для name.
  • В вашем исходном коде, я думаю, initialize инициализируется с допустимым значением
  • В функции add_data_label() оператор initialize++; должен быть написан непосредственно перед возвратом, чтобы получить правильные операторы печати отладки.
...