2012-01-10 3 views
0

Я объявляюМассива ЬурейеГо Struct не функционирует должным образом при вызове функции

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

LABELS_STRUCT labels_array[ARRAY_LABELS]; 

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

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; 
} 

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

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

ответ

1

В функции add_data_label() вы должны сделать strcpy() входящего char * label к LABELS_STRUCT «s char *name;. Вы также должны выделить память для name в LABELS_STRUCT's 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() «под ред памяти. Поэтому, аналогично add_data_label(), вы должны иметь delete_data_label() где вы звоните free() для name.
  • В исходном коде, я думаю initialize инициализируются с допустимым значением
  • В функции add_data_label() Заявления initialize++; должно быть написано как раз перед возвращением, чтобы получить заявление отладки печати исправить.
+0

ВЫ ТАКОЙ ЖИЗНЕННЫЙ СПАСАТЕЛЬ. Я проезжаю более 12 часов, ПЫТАЮТСЯ К РИСУНКУ –

+0

@AironZagarella Я рад! :) Удачи!! –

+0

@ RaviSharma Хорошая точка! Спасибо, что добавили заметку! :) –

Смежные вопросы