我需要将数组聊天值数组放入指针数组中。首先,我使用了这样的代码,它适用于我。
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;
所以我可以通过索引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)
答案 0 :(得分: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
或其更安全的版本。)
答案 1 :(得分: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&lt; d字符串传递给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 ...(数组len -1) 因此,12(a <13)将访问超出阵列的上限。 导致未定义的行为,这可能/将导致seg故障事件。
建议以下代码:
#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
答案 2 :(得分: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>}
答案 3 :(得分:-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分配的内存,否则最终可能会占用所有内存资源。