C Uint8_t设置本身

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命令之前打印它,它的值在程序的持续时间

我有一些小烦恼,而不是一个错误,但我不明白为什么它会发生。我有一个数组索引和2D gchar数组,声明如下:

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()
它很少有用,而且它的使用很容易出错。在您的情况下,只有当截断的结果有任何用处时,它才有意义。