C Uint8_t设置本身
我有一些小烦恼,而不是一个错误,但我不明白为什么它会发生。我有一个数组索引和2D gchar数组,声明如下:C Uint8_t设置本身,c,uint8t,C,Uint8t,我有一些小烦恼,而不是一个错误,但我不明白为什么它会发生。我有一个数组索引和2D gchar数组,声明如下: gchar FilterArray[10][51]; static uint8_t ArrayIndex = 0; static gchar ScanLine[9640]; 现在,我第一次使用数组索引时,它的值是115。在使用它之前,我没有在代码中的任何地方设置它。如果我在strcpy命令中使用它之后才打印出来,它的值是115。如果我在strcpy命令之前打印它,它的值在程序的持续时间
gchar FilterArray[10][51];
static uint8_t ArrayIndex = 0;
static gchar ScanLine[9640];
现在,我第一次使用数组索引时,它的值是115。在使用它之前,我没有在代码中的任何地方设置它。如果我在strcpy命令中使用它之后才打印出来,它的值是115。如果我在strcpy命令之前打印它,它的值在程序的持续时间内是正确的
while(FilterAmount != 0)
{
g_io_channel_read_chars (source,(gchar *) ScanLine,1,&BytesRead,&GlibError);
if(ScanLine[0] == FilterTerminator[0]) {
printf("Array Index: %i\n", ArrayIndex);
if(strlen(FilterName) > 0){
printf("Array Index: %i\n", ArrayIndex); //if I only print before, value is correct
strcpy(FilterArray[ArrayIndex],FilterName);
printf("Array Index: %i\n", ArrayIndex); //if I only print after, value is incorrect
ArrayIndex++;
FilterAmount--;
FilterName[0] = '\0';
}
}
else {
strcat(FilterName, ScanLine);
}
}
大概,
FilterName
过长,并且strcpy(FilterArray[ArrayIndex],FilterName)
写入的内容超出FilterArray
的末尾,超过ArrayIndex
。如果在strcpy之前打印,ArrayIndex
似乎是正确的,这可能是因为该值保存在寄存器中,并且没有从被覆盖的内存位置再次加载。为什么要使用strncpy()
而不是strcpy()
,strncpy
的缓冲区大小应该是目标缓冲区的大小,而不是源缓冲区的大小。115是s
的ASCII值。这有什么帮助吗?@alk我最初使用strcpy(),我认为我的问题可能与此有关,所以我改用strncpy(),但不幸的是没有任何区别。@MOehm哦,这是一个错误,很好的回答。幸运的是,这对我影响不大。这可能意味着什么……让我来研究一下。去掉strncpy()
它很少有用,而且它的使用很容易出错。在您的情况下,只有当截断的结果有任何用处时,它才有意义。