2016-07-04 2 views
1

У меня есть следующий код, но результат нулевой для всех компонентов структуры:Списка с STRUCT указателем

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

typedef struct _TransactionType 
{ 
    char field1[20]; 
    char field2[20]; 
}TransactionType; 

int main(int argc, char *argv[]) { 
    int i; 
    int numreg = 0; 
    char temp[12]; 
    TransactionType *dbTransaction; 

    dbTransaction = (TransactionType*) calloc(10,sizeof(TransactionType)); 


    for(i=0; i<5;i++) 
    { 
     memset(temp,0,sizeof(temp));   
     sprintf(temp,"%d",i); 
     strcpy(dbTransaction->field1, temp); 
     dbTransaction->field1[strlen(dbTransaction->field1)] = '\0'; 
     strcpy(dbTransaction->field2, temp); 
     dbTransaction->field2[strlen(dbTransaction->field2)] = '\0'; 
     numreg++; 
     dbTransaction++;  
    } 

    printf("reg = %d\n", numreg); 

    for (i=0; i<numreg;i++) 
    { 
     printf("dbTransaction->field1 = %s\n",(dbTransaction + i)->field1); 
     printf("dbTransaction->field2 = %s\n",(dbTransaction + i)->field2); 

    } 


    return 0; 
} 

мне нужно восстановить значение структуры. Пожалуйста, любой вид помощи будет оценить Заранее спасибо за помощь

+0

[. Пожалуйста, смотрите эту дискуссию о том, почему не бросить возвращаемое значение 'таНос()' и семьи в 'C'] (http://stackoverflow.com/д/605845/2173917). –

+1

Какой смысл устанавливать терминаторы в явном виде? Они уже есть. –

+0

... и если это не так, 'strlen' не поможет. –

ответ

1

Вы должны добавить проверку ошибок и отливку calloc значений обескуражен, но причина, что ваш код не работает, что вы заранее dbTransaction указатель в вашем но никогда не перематывайте его назад. Отпечатки, которые вы делаете, представляют собой элементы 5-9 массива, когда вы заполняете элементы 0-4.

См исправленный код:

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

typedef struct _TransactionType 
{ 
    char field1[20]; 
    char field2[20]; 
}TransactionType; 

int main(int argc, char *argv[]) { 
    int i; 
    int numreg = 0; 
    char temp[12]; 
    TransactionType *dbTransaction; 
    TransactionType *dbTransactionRoot; 

    dbTransaction = (TransactionType*) calloc(10,sizeof(TransactionType)); 
    dbTransactionRoot = dbTransaction; 


    for(i=0; i<5;i++) 
    { 
     memset(temp,0,sizeof(temp)); 
     sprintf(temp,"%d",i); 
     strcpy(dbTransaction->field1, temp); 
     dbTransaction->field1[strlen(dbTransaction->field1)] = '\0'; 
     strcpy(dbTransaction->field2, temp); 
     dbTransaction->field2[strlen(dbTransaction->field2)] = '\0'; 
     numreg++; 
     dbTransaction++; 
    } 

    printf("reg = %d\n", numreg); 

    for (i=0; i<numreg;i++) 
    { 
     printf("dbTransaction->field1 = %s\n",(dbTransactionRoot + i)->field1); 
     printf("dbTransaction->field2 = %s\n",(dbTransactionRoot + i)->field2); 

    } 


    return 0; 
} 
+0

Это правда; Большое спасибо – user5240895

+0

Вы также должны рассмотреть возможность доступа к указателю как массиву с нотной скобкой вместо того, чтобы увеличивать его, это позволит вам исключить вспомогательный указатель –

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