Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么会有如此不确定的增值?_C - Fatal编程技术网

C 为什么会有如此不确定的增值?

C 为什么会有如此不确定的增值?,c,C,我是在代码块(我唯一拥有的编译器)上写这段代码的。当我遇到这样的行为时。请有人告诉我为什么ct会出现这种情况,我是不是遗漏了什么 #include <stdio.h> int main(int argc,char* argv[]) { int lov[3][2]={0}; int ct=0; char* art; if(argc!=4) return 1; art=argv[1]; do

我是在代码块(我唯一拥有的编译器)上写这段代码的。当我遇到这样的行为时。请有人告诉我为什么ct会出现这种情况,我是不是遗漏了什么

#include <stdio.h>
int main(int argc,char* argv[])
{
    int lov[3][2]={0};        
    int ct=0;
    char* art;
    if(argc!=4)
        return 1;   


   art=argv[1];
        do
        {
            if(*art=='L' & *(art+1)=='o' & *(art+2)=='c')
            {
                printf("\n\n (art+3)=%s ,*(art+3)=%c ,*(art+5)=%c",(art+3),*(art+3),*(art+5) );
                lov[ct][ct]=*(art+3)-48;
                lov[ct][ct+1]=*(art+5)-48;
                printf("\nct=%d,lov[x][x]=%d,lov[x][x+1]=%d ",ct,lov[ct][ct],lov[ct][ct+1]);
                ct++;
            }
            art+=3;
        }
        while(*(art++));
getchar();
}
ct=5,lov[x][x]=4198582

,lov[x][x+1]=4


为什么ct变为5??(最后一行)

似乎
ct
正在被覆盖,因为您正在访问
lov
越界。您的编译器可能将
ct
lov
放在堆栈上彼此靠近的位置,这就是
ct
被错误修改的原因

ct
等于
1
时,您写入
lov[ct][ct+1]
,即
lov[1][2]
。那是不允许的。但是下一次你写信给
lov[2][2]
lov[2][3]
时,其中一个将导致修改
ct

当您编写
lov[ct][ct+1]
时,这只能对
ct==0
有效。
ct
的所有其他值会导致数组的越界访问


鉴于此代码的混乱性质,如果存在其他此类错误,我不会感到惊讶。

lov
是一个维度为
[3][2]
的数组
ct
5
,因此
lov[5][5]
是非常出格的。无法保证您将得到什么。

您的代码有多个问题,而C语言会按照您所说的去做


在像这样取消引用指针之前:

if(*art=='L' & *(art+1)=='o' & *(art+2)=='c')
a)    %s <- art+3
b)    %c <- *(art+3)
c)    %c <- *(art+5)
您应该检查它们是否有效,即您应该首先检查
art
的长度


您的格式字符串有问题:

printf("\n\n (art+3)=%s ,*(art+3)=%c ,*(art+5)=%c",(art+3),*(art+3),*(art+5) );
i、 例如,您使用的格式说明符如下:

if(*art=='L' & *(art+1)=='o' & *(art+2)=='c')
a)    %s <- art+3
b)    %c <- *(art+3)
c)    %c <- *(art+5)
您对
ct
没有任何限制,因此您有资格获得潜在的非法写作->未定义行为邀请


然后:

什么是艺术?你在哪里初始化的?你为什么要增加它


总而言之:当你似乎在写
lov
的时候,你可能会毁灭你的
ct
价值观:

lov[ct][ct]=*(art+3)-48;
lov[ct][ct+1]=*(art+5)-48;

问题是为什么ct会变为5???您的代码以一种非常可疑的方式访问
argv
。考虑转换为<>代码> < /Cult>循环,以访问<代码> ARGV 。代码的目的是什么?作为一个陌生人,这对我来说毫无意义。非常感谢……好像堆栈被五个覆盖了……非常感谢much@sepp2k即使是
lov[1][2]
也仍然超出范围,将导致行为不符合预期。是的,正如我已经说过的,修改
ct
的将是
lov[2][X]
访问。谢谢……下次我将发布3000行代码,包括所有缓冲区安全性、堆安全性,以及其他任何东西……@pire brain:永远不要发布幻想代码。发布实际代码。您显示的代码很糟糕、错误,并且有很多未定义的行为。如果您有检查和安全性以及正确的代码(您暗示您只是为了示例而忽略了这些代码),那么就不会出现错误。
lov[ct][ct]=*(art+3)-48;
lov[ct][ct+1]=*(art+5)-48;