0

我需要将数组聊天值数组放入指针数组中。首先,我使用了这样的代码,它对我有用。

char *current_tag_lists[20];
char current_tag_list1[]="0005808897";
char current_tag_list2[]="0009953997";
char current_tag_list3[]="0000116600"; 
current_tag_lists[0] = current_tag_list1;
current_tag_lists[1] = current_tag_list2;
current_tag_lists[2] = current_tag_list3;

所以我可以通过 index 访问该值current_tag_lists[0]

但我的实际要求是在运行时添加这些值,如下所示。这是一个示例代码。

char *current_tag_lists[20];

while(k<6)
 {
    char RFID_input_characters[12];
    while(a<13){
        if(a==12){
            current_tag_lists[k]=RFID_input_characters;
            a=0;
            k++;
            break;
        }
        else{
            RFID_input_characters[a]='a'; // this example in my code it get value like this
            a++;
       }
     }
   }

但问题是“current_tag_lists”不存储所有值。它只存储当前值。它每次都替换以前的值。我需要将值保留为我上面的示例,并且需要从索引(current_tag_lists [0])访问。

谁能帮帮我吗。这是我的实际代码。

while(k<6)//while(!(c1==1))
{
    char RFID_input_characters[12]={0};
    while(a<14){


        if (a == 0) {
            ReceiveByteSerially();
            a++;
        }

        else if (a == 13 ) {
            ReceiveByteSerially();
            current_tag_lists[k] = malloc(strlen(RFID_input_characters) + 1);
            strcpy(current_tag_lists[k], RFID_input_characters);
            Lcd_Set_Cursor(1,1);
            Lcd_Write_String(RFID_input_characters);
            Lcd_Set_Cursor(2,1);
             Lcd_Write_String(current_tag_lists[k]);
            a = 0;
            k++;
            break;
        }
        else if(k%2!=0 && a==1){
             char x=ReceiveByteSerially();
             if((x!=0x02)&&(x!=0X03)){
                a++;
             }
        }
        else{
            char x=ReceiveByteSerially();
             if((x!=0x02)&&(x!=0X03)){
                 if(k%2 !=0){
                     RFID_input_characters[a-2] = x;
                 }
                 else if(a<12){
                RFID_input_characters[a-1] = x;
                 }
                a++;
        }
        }
    }

}

请只看 if(a==13)。

这是我的错误日志。

C:\Program Files (x86)\Microchip\xc8\v1.33\sources\common\strcpy.c:19:     error: (1466) registers  unavailable for code generation of this expression
 (908) exit status = 1
 make[2]: ***      [dist/default/production/Super_Smart_Backpack.X.production.hex] Error 1
 make[1]: *** [.build-conf] Error 2
 make: *** [.build-impl] Error 2`
`nbproject/Makefile-default.mk:119: recipe for target  'dist/default/production/Super_Smart_Backpack.X.production.hex' failed
make[2]: Leaving directory 'F:/Irushi-final/Super Smart Backpack.X/Super   Smart Backpack.X'
nbproject/Makefile-default.mk:78: recipe for target '.build-conf' failed
make[1]: Leaving directory 'F:/Irushi-final/Super Smart Backpack.X/Super Smart Backpack.X'
nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed

BUILD FAILED (exit value 2, total time: 1s)
4

4 回答 4

0

您可以这样做:

如果我理解正确的话。

// First you create a normal null terminated string and copy some test string to it
char RFID_input_characters[12]="test";
....
// Now since you have array of pointers, you can allocate some space 
// and set k-th pointer point to it
current_tag_lists[k] = malloc(strlen(RFID_input_characters) + 1);

// Now you can copy something to the memory you allocated
strcpy(current_tag_lists[k], RFID_input_characters);

以后别忘了free

你一直拥有它的方式是你将每个指针设置为相同的地址 - 那是数组的起始地址RFID_input_characters(你在那里的分配没有复制字符串,只是将第 k 个指针指向RFID_input_characters数组的开头。复制您可以使用的字符串strcpy或其更安全的版本)。

于 2015-06-19T19:05:54.730 回答
0

给定发布的代码:

char *current_tag_lists[20];

while(k<6)
 {
    char RFID_input_characters[12];
    while(a<13){
        if(a==12){
            current_tag_lists[k]=RFID_input_characters;
            a=0;
            k++;
            break;
        }
        else{
            RFID_input_characters[a]='a'; // this example in my code it get value like this
            a++;
       }
     }
   }

有几个细节需要注意:

1) 需要将 current_tag_lists[] 初始化为所有 NULL,以便稍后需要将 malloc 的字符串传递给 free()

char *current_tag_lists[2] = { NULL };

2)每个字符串都需要一个唯一的存储位置:

char *temp =NULL;
if( NULL == (temp = malloc( 12 ) ) )
{ // then malloc failed
    perror( "malloc failed" );
    cleanup();  // frees all malloc'd areas
    exit( EXIT_FAILURE );
}

// implied else, malloc successful

关于这条线:

while( a < 13 )

每个条目的最大字符数是(根据原始代码和上面的 mallocf() 12。C 将数组中的偏移量引用为 0...(array len -1)所以 12(a<13)将访问超出上数组的边界。导致未定义的行为,这可能/将导致段错误事件。

建议以下代码:

#include <stdlib.h>  // exit, EXIT_FAILURE
#include <string.h>  // malloc, free

#define MAX_TAG_LISTS (20)
#define MAX_RFID_LEN (12)

char *current_tag_lists[ MAX_TAG_LISTS ];

// initialize current_tag_lists[] to make cleanup simple
memset( current_tag_lists, '\0', sizeof(current_tag_lists));

char *temp =NULL;
for( int k = 0; k < MAX_TAG_LISTS; k++ )
{
    if( NULL == (temp = malloc( MAX_RFID_LEN ) ) )
    { // then malloc failed
        perror( "malloc failed" );
        cleanup( current_tag_lists );  // frees all malloc'd areas
        exit( EXIT_FAILURE );
    }

    for( int a = 0; a < MAX_RFID_LEN; a++ )
    {
         temp[a]='a'; // this example in my code it get value like this
    } // end for

    current_tag_lists[k]=temp;
    temp = NULL;
} // end for



void cleanup( char *current_tag_lists )
{
    int i;
    for( i = 0; i < MAX_TAG_LISTS; i++)
    {
        // note: ok to pass NULL to free
        free( current_tag_lists[i] );
    }
} // end function: cleanup
于 2015-06-19T19:37:02.173 回答
0

在您可能不想使用的微控制器上malloc,您的算法似乎有非常明确的需求,因为这对于微控制器来说是正常的。在你的算法中

char *current_tag_lists[20];
while(k<6)
{
    char RFID_input_characters[12];

你定义了一些数字。首先,您应该对常量 20,6 和 12 使用符号:

enum tag_list_params { tag_list_len=20, rfid_len=12, num_input_cycles=6 };

并在您的代码中替换它们。

现在你定义空间

typedef char rfid_t[rfid_len];
rfid_t tag_list_space[tag_list_len];

然后你可以current_tag_list指向tag_list_space

char* current_tag_lists[20];

当然你可以&tag_list_space[a]直接使用,但你可以这样做

current_tag_lists[k]=(char*)&tag_list_space[k];

使用您定义的变量。当您写入标签列表时,您也可以简单地指向空格

char* RFID_input_characters;
for(k=0;k<num_input_cycles;k++)
{
    current_tag_lists[k]=(char*)&tag_list_space[k]; /* save to your target structure */
    RFID_input_characters = (char*)&tag_list_space[k];
    for(a=0; a<rfid_len;++a) {
        RFID_input_characters[a] = 'a';
    }
}

完整的测试程序可能如下所示:

/* enum tag_list_params { tag_list_len=20, rfid_len=12, num_input_cycles=6 }; */
#define tag_list_len 20
#define rfid_len 12
#define num_input_cycles 6

typedef char rfid_t[rfid_len];

char* current_tag_lists[tag_list_len]; /* this is the parameter you want to modify outside 
    you can define it as
        extern char** current_tag_list;
    if you export it in a header file */
static rfid_t tag_list_space[tag_list_len]; /* if you define the space inside of the function,
    the memory will get lost on function exit */

void all_a(void)
{
    int k, a;
    char* RFID_input_characters;
    for(k=0;k<num_input_cycles;k++)
    {
        current_tag_lists[k]=(char*)&tag_list_space[k]; /* save to your target structure */
        RFID_input_characters = (char*)&tag_list_space[k];
        for(a=0; a<rfid_len;++a) {
            RFID_input_characters[a] = 'a';
         }
    }
}

void main(void)
{
    all_a();
}

当 all_a 准备好时,来自 gdb 输出:

(gdb) p current_tag_lists
$1 = {0x601080 <tag_list_space> 'a' <repeats 72 times>,
    0x60108c <tag_list_space+12> 'a' <repeats 60 times>,
    0x601098 <tag_list_space+24> 'a' <repeats 48 times>,
    0x6010a4 <tag_list_space+36> 'a' <repeats 36 times>,
    0x6010b0 <tag_list_space+48> 'a' <repeats 24 times>,
    0x6010bc <tag_list_space+60> 'a' <repeats 12 times>,
    0x0 <repeats 14 times>}
于 2015-06-19T19:43:25.300 回答
-1

实际上 char *current_tag_lists[20]; 是一个指向字符的指针数组。在这一行 current_tag_lists[k]=RFID_input_characters; 您将指针 RFID_input_characters 存储在 current_tag_lists[k] 而不是其内容中。由于 current_tag_lists[k] 指向 RFID_input_characters 的内存地址,因此更改 RFID_input_characters 的内容会反映在 current_tag_lists[k] 中。

您可以像这样更改代码:

  char *current_tag_lists[20];
    while(k<6)
    {
        char RFID_input_characters[12];
        a=0;
        while(a<13){
            if(a==12){
                current_tag_lists[k]=malloc(12);
                strcpy(current_tag_lists[k],RFID_input_characters);
                break;
            }
            else{
                RFID_input_characters[a]='a'; // this example in my code it get value like this
                a++;
           }
         }
        k++;
}

不要忘记释放使用 malloc 分配的内存,否则您最终可能会使用所有内存资源。

于 2015-06-19T19:32:18.840 回答