C 为什么会有如此不确定的增值?
我是在代码块(我唯一拥有的编译器)上写这段代码的。当我遇到这样的行为时。请有人告诉我为什么ct会出现这种情况,我是不是遗漏了什么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
#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;