精华内容
下载资源
问答
  • 静态数组维度不一样不能赋值,否则会引起编译错误 动态数组和丢失了静态大小成为了array_base的数组维度不一样时,赋值引发 std::length_error异常,可以捕捉到, 比较也是这样 7.作为函数的参数 还...
  • 不能调试+全局变量无故变化 vc6.0

    千次阅读 2012-06-20 13:13:31
    1. 不能调试,错误提示: one or more breakpoints cannot be set and have been disabled... 网上查了资料没能解决,最后的解决方法: ...2.程序中有个全局变量在给一个“数组赋值后就无故变化,不能

    1. 不能调试,错误提示: one or more breakpoints cannot be set and have been disabled...

    网上查了资料没能解决,最后的解决方法:

    把工程拷贝到新的目录下,删除工程中的 ncb, .opt, .plg文件。 注意是拷贝,不是剪切

    重新设置断点进行调试,OK!


    2.程序中有个全局变量在给一个“数组”赋值后就无故变化,不能理解,这个赋值语句怎么会对这个无关的全局变量造成影响呢?

    inputBuf[i] = inchar;  //造成全局变量scanCount变化


    程序中的定义如下:

    char inputBuf[HALF_BUFSIZE] = {'\0'};      //读入字符的对半缓冲区
    int scanCount = 0;                                    //缓冲区当前位置的字符


    分析:首先,这是全局变量,是在堆中的空间,在内存中scanCount这个变量是紧挨着 inputBuf 的,

    错误原因:inputBuf 定义小了,所以当超过 inputBuf 超过 HALF_BUFSIZE 时,就会变成对scanCount的赋值。





    展开全文
  • 一些VC 数据结构操作类代码集,各个类文件说明:array.h:安全数组,可自动增长大小(随机访问,但扩充时效率低)  linkedlist.h: 普通链表(可随机访问,但访问效率低)  dclinkedlist: 双向循环链表(不可...
  • 在对程序进行调试时,VC总会报出这种类型的错误,总结了如下几条产生错误的原因:1、声明指针后,没有对其指向对象初始化,造成指针的越界错误。2、数组访问越界,这种情况一般是数组索引号大于定义时声明的索引造成...

    在对程序进行调试时,VC总会报出这种类型的错误,总结了如下几条产生错误的原因:

    1、声明指针后,没有对其指向对象初始化,造成指针的越界错误。

    2、数组访问越界,这种情况一般是数组索引号大于定义时声明的索引造成的。

     

    总体来看,主要是因为指针的使用不当造成的,着和c++ primer中强调的一样。对象在生命后,一定要赋值,尽量不要是用默认值。

    展开全文
  • left operand must be l-value 错误提示总结

    千次阅读 2011-03-06 19:44:00
    编译器:vc6.0语言:c/c++= : left operand must be l-value 到底是什么错误?解释:赋值号(‘=’)左边的操作数必须是一个左值。通俗的说:左值就是可以改变的值的变量。发生这个错误的原因是你把常量(或不可改变...

    编译器:vc6.0
    语言:c/c++

    = : left operand must be l-value 到底是什么错误?

    解释:赋值号(‘=’)左边的操作数必须是一个左值。通俗的说:左值就是可以改变的值的变量。

    发生这个错误的原因是你把常量(或不可改变值的变量)放到了赋值号的左边。

    例如:int a[3];
               a++;//这里就相当于a=a+1;注意a是数组a[3]的首地址,在声明a[3]后,将开辟一段连续内存空间。
                     //就是这段连续内存空间的首地址,是一个常量。所以这里将常量放到了赋值号的左边是错误。
                     //类似的,你在C语言中是不可以写2++;的。

    例如:const int num=5;
            int b=3;
            num=b+4;//这里num为不可改变的值,不能放到赋值号的左边。

    总结:赋值号左边的值只能是左值。而上面两个例子中的a,num都不是左值,所以在编译时会出错。

    解决方法:将=换位==

    展开全文
  • 代码语法错误分析工具pclint8.0

    热门讨论 2010-06-29 07:00:09
    它进行程序的全局分析,能识别没有被适当检验的数组下标,报告未被初始化的变量,警告使用空指针,冗余的代码,等等。软件除错是软件项目开发成本和延误的主要因素。PClint能够帮你在程序动态测试之前发现编码错误。...
  • 数组的赋值给数组赋值的方法除了用赋值语句对数组元素逐个赋值外, 还可采用初始化赋值和动态赋值的方法。数组初始化赋值数组初始化赋值是指在数组说明时给数组元素赋予初值。 数组初始化是在编译阶段进行的。这样将...
  • c语言指针疑惑[转载]

    2015-12-03 03:14:00
    c99的动态数组是在栈上面开辟的,而new出来的是在堆上面开辟的。栈和堆的地址是从两端相向增长的。栈很小,一般只有几十k,vc6好像是64k。堆很大,在win32的虚拟地址空间可以分配到2g的内存。...1、把数组赋值...

     

    c99的动态数组是在栈上面开辟的,而new出来的是在堆上面开辟的。
    栈和堆的地址是从两端相向增长的。
    栈很小,一般只有几十k,vc6好像是64k。
    堆很大,在win32的虚拟地址空间可以分配到2g的内存。
    栈由程序自动操作,包括局部变量,参数传递,函数跳转时的返回地址等信息。
    堆由程序员自行管理内存,优势,节省空间,不用时即释放,缺点,可能因使用不但造成内存泄露,野指针,造成程序错误。
    1、把数组名赋值给指针表示将数组的首元素的地址赋予此指针。
    int a[3] = {2,5,8};
    int* p = a;
    2、a[0]是a数组的首元素,而&则是取地址运算符,所以“ &a[0]”取得的同样是a数组的首元素的地址,因此这段代码的含义和代码段是一致的。
    int a[3] = {2,5,8};
    int* p = &a[0];
    3、这两句不都是声明一个字符串吗?有什么区别吗?
    char * c1 = "Hello";
    char c2[6] = "World";
    "Hello"是一个字符串,然后让char指针c1指向这个字符串的首元素的地址。
    第二句是声明一个长度为6的char类型数组,并且设置数组的初始值为"World"。注意末尾还有一个隐藏的“\0”,所以长度是6,而不是5。
    4、数组指针的加减运算
    对于指向数组的指针变量可以进行加减运算,比如对于指向数组的指针p,p++、p--、p+2等都是合法的。这里的加减运算并不是针对数组元素的,而是针对指针位置的,比如p当前指在首元素上,那么p++后就指在第二个元素上;比如p当前指在第5个元素上,那么p=p-2后,p就指在第3个元素上。
    例子:
    char * c1 = "Hello";
    printf("%c\n",*c1);//输出H
    c1++;
    printf("%c\n",*c1);//输出e
    5、指针之间的运算
    两个指针之间可以进行减法运算,只有指向同一个数组的两个指针之间进行减法运算才有意义,而指向不同数组的两个指针之间进行减法运算则没有意义。为什么呢?
        指针其实就是内存中的地址,两个指针的减法运算计算的就是两个内存地址之间的元素的个数,比如整数指针p1指向内存地址2008H,整数指针p2内存地址2000H,而整数占4个字节,所以p1-p2的结果就是(2008H-2000H)/4=2,也就是 p1和p2 之间相差 2 个元素。很显然两个指针进行加法运算或者两个指向不同变量的指针进行减法运算都是没有意义的。
    例子:
    int a1[5]={3,5,6,8,2};
    int* p1 = a1;//p1是指向第0个元素的地址
    int* p2 = &a1[3];//p2指向的是第3个元素的地址
    p1++;//p1指向了第1个元素
    printf("%d",p2-p1);//输出2
    6、指针之间的大小比较
    指向同一个数组的两个指针之间进行大小的比较是有意义的。比较结果为地址高低的比较:
    例子:
    int a1[5]={3,5,6,8,2};
    int* p1 = a1;
    int* p2 = &a1[3];
    p1++;
    printf("%d\n",p2<p1);//输出0,因为p2的地址比p1高2位
    p1=p1+2;//p1在数组内向高位移动两位
    printf("%d\n",p2==p1);//输出1 ,因为p1和p2的位相等
    7、数组做为参数传递给函数
    可以将数组做为传递给函数,比如下面的代码就是将传入输入的每个元素乘以2:
    void makeDoule(int arr[],int len)
    {
     int i=0;
     for(i=0;i<len;i++)
     {
      arr= arr*2;
     }
    }
    int main(int argc, char *argv[])
    {
     int a1[5]={3,5,6,8,2};
     int i = 0;
     int len=sizeof(a1)/sizeof(int);
     makeDoule(a1,len);
     for(i=0;i<len;i++)
     {
      printf("%d ",a1);
     }
    }
    运行结果:
    6 10 12 16 4传递给makeDoule函数的是a1,我们知道,一个数组的名字其实就是指向数组首元素的地址。所以makeDoule函数得到的arr就是数组a1的指针,那么在函数内部对arr进行操作的话就会改变a1数组。
    所以makeDoule函数也可以写成下面的样子,这两个函数是等价的:
    void makeDoule(int* arr,int len)
    {
     int i=0;
     for(i=0;i<len;i++)
     {
      arr= arr*2;
     }
    }
    当然写成下面的形式更符合指针的使用习惯,因此推荐这种用法:
    void makeDoule(int* arr)
    {
     int i=0;
     for(i=0;i<5;i++)
     {
      //arr+i指向的值设置为arr+i指向的值的二倍。
      *(arr+i)= *(arr+i)*2;
     }
    }
    有的同学可能会问,为什么makeDoule函数还需要传递数组的长度len呢?makeDoule函数这样写不就行了吗?
    void makeDoule(int* arr)
    {
     int i=0;
     for(i=0;i<5;i++)
     {
      arr= arr*2;
     }
    }
    这样写在这个函数中是没有问题的。但是这个makeDoule函数不一定为只为a1服务,函数的最重要的特征是可以复用,也就是可以被其他地方调用,如果我们想用makeDoule函数为另外一个长度为20的数组进行“每个元素乘以2”的操作,那么将数组长度5写死在函数中就会有问题了。
    那么为什么不在函数内部计算数组的长度呢?省得还传递一个len参数
    void makeDoule(int arr[])
    {
     int i=0;
     int len = sizeof(arr)/sizeof(int);
     for(i=0;i<len;i++)
     {
      arr= arr*2;
     }
    }
    int main(int argc, char *argv[])
    {
     int a1[5]={3,5,6,8,2};
     int i = 0;
     int len=sizeof(a1)/sizeof(int);
     makeDoule(a1);
     for(i=0;i<len;i++)
     {
      printf("%d ",a1);
     }
    }
    运行以后程序竟然输出了:6 5 6 8 2
    只有第一个元素被“乘以2”。为什么呢?
    运行下面的程序试一试:
    void test(int arr[])
    {
     printf("%d\n",sizeof(arr)/sizeof(int));
    }
    int main(int argc, char *argv[])
    {
     int a1[5]={3,5,6,8,2};
     printf("%d\n",sizeof(a1)/sizeof(int));
     test(a1);
    }
    运行结果竟然是:
    5
    1为什么在main函数中计算数组的大小是5,在test函数中计算数组arr的大小就变成了1了呢?在C语言中可以通过sizeof的方式取得一个数组的尺寸,这是我们已经知道的。但是一旦把这个数组传递给函数的时候,到了函数内部使用的就是指向这个数组的指针了,虽然在test函数中arr声明的是数组,但是这里的arr只是一个指针而已了,arr本质上只是一个int类型的指针,而int类型的指针的大小是4,所以sizeof(arr)/sizeof(int)的结果就是1。这点是经常容易犯错的,需要特别注意。如果对指针还有什么不清楚的,可以到这个网址查询指针的学习资料:http://www.jsj321.com/forum/forumdisplay.php?fid=4   ,指针是比较不好理解的,因此学习过程中要多试验,多思考,不要气馁。8、多维数组的指针
    设有一个二维数组int a[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}}
    (1)C语言允许把一个二维数组分解为多个一维数组来处理。因此数组 a 可分解为三个一维数组,即 a[0],a[1],a[2]。每一个一维数组又含有四个元素。例如 a[0]数组,含有 a[0][0],a[0][1],a[0][2],a[0][3]四个元素。
    (2)从二维数组的角度来看,a 是二维数组名,a 代表整个二维数组的首地址,也是二维数组 0 行的首地址。
    特别注意a+1表示第1行的首地址,而不是第0行第第1列的地址,这是初学者最容易犯错的地方。
    同样a[1]也是第1行一维数组的数组名和首地址。
    所以a+1、*(a+1)、[1]是等价的。
    (4)在二维数组中不能把&a理解为元素 a的地址,因为a不是一个数组元素,a是一种地址计算方法,它本身就表示数组 a 第 i 行首地址。所以&a和 a是等价的。这一点也是初学者最容易犯错的地方。
    (5)从上边的分析我们得知a[0]+1是 a[0]的 1 号元素首地址,由此可得出 a+j 则是一维数组 a的 j 号元素首地址,它等于&a[j]。
    由 a=*(a+i)得 a+j=*(a+i)+j。由于*(a+i)+j 是二维数组 a 的 i 行 j 列元素的首地址,所以,该元素的值等于*(*(a+i)+j)。
    理解了下面的算法也就理解了多维数组的指针问题:
    int main(int argc, char *argv[])
    {
     int a[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}};
     printf("%d\n",*(*(a+1)+2));
     printf("%d\n",*(a[1]+2));
    }
    程序输出如下:
    6
    6两个表达式都输出a[1][2]的值。*(a+1)则表示二维数组a的第1行,也就是等价于a[1]。a[1]、*(a+1)都表示数组的第1行。所以*(a[1]+2))和*(*(a+1)+2)都表示数组的第1行的第2个元素的值。
    有的同学会问了,既然“*(a+1)”和“a+1”是等价的,为什么“printf("%d\n",*((a+1)+2)))”输出结果是错误的呢?
    编译器在编译“*((a+1)+2)))”的时候会把“(a+1)+2”优化成“a+3”,因此“*((a+1)+2)))”就变成了“*(a+3)”,也就是a数组第3个一维数组的首地址,显然这个只是一个地址,并不是我们想像中的a[1][2]的值,所以输出了一个非常大的数。为了避免编译器的这种误解,建议大家表示“二维数组a的第1行”的时候用a[1]或者*(a+1),而尽量不要用(a+1)因为很容易出错。
    9、函数指针
        在C语言中,一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址。我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使该指针变量指向该函数。然后通过指针变量就可以找到并调用这个函数。我们把这种指向函数的指针变量称为“函数指针变量”。
    函数指针变量定义的一般形式为:
    函数的返回值的类型  (*指针变量名)(参数列表);
    其中“参数列表”可以省略,不过建议明确标明“参数列表”。
    例子:
    void PrintIt(int i)
    {
     printf("%d\n",i);
    }
    int main(int argc, char *argv[])
    {
     int i = 0;
     int arr[5] = {3,5,8,2,1};
     void (*myAction)(int);
     myAction = PrintIt;
     for(i=0;i<sizeof(arr)/sizeof(int);i++)
     {
      myAction(arr);
     }
    }
    上面的程序遍历数组arr的所有元素,并且打印每个元素。
    有的同学会说,这样做有什么意义吗?把“myAction(arr)”直接换成“PrintIt(arr)”不就得了吗?
    这么替换在这里是非常合理,也是非常正确的,但是有一天我发现很多地方都要遍历数组做不同的事情,为了避免每次都写for循环,我将遍历数组的功能抽取到一个单独的公共函数中完成
    void eachItem(int* pArray,int len,void (*action)(int))
    {
     int i = 0;
     for(i=0;i<len;i++)
     {
      //调用函数指针
      action(*(pArray+i));
     }
    }
    注意函数eachItem的最后一个参数为函数指针类型。
    这样main函数就可以简化成如下的样子了:
    void PrintIt(int i)
    {
     printf("%d\n",i);
    }
    int main(int argc, char *argv[])
    {
     int arr[5] = {3,5,8,2,1};
     int len = sizeof(arr)/sizeof(int);
     eachItem(arr,len,PrintIt);
    }
    以后在其他的地方想对int数组做其他处理,那么只要写不同的函数就可以了,比如说要将数组中的奇数输出:
    void PrintOdd(int i)
    {
     if((i%2)==1)
     {
      printf("%d是奇数\n",i);
     }
    }
    在main函数中如下调用即可:
    eachItem(arr,len,PrintOdd);
    可以看到通过函数指针,将循环遍历算法和具体的处理算法隔离了,实现了代码的复用。
    函数指针在编程中有非常多的应用。函数指针有时候又被称为回调,在事件机制、模板算法等场合有着广泛应用,因此一定要掌握好。MFC、STL等流行的框架中都大量的应用了函数指针,在JSJ321.com的《C语言也能干大事》系列在线教学中也将进一步讲解函数指针的更生动的应用。
    附录:本小节用到的代码:
    void PrintIt(int i)
    {
     printf("%d\n",i);
    }
    void PrintOdd(int i)
    {
     if((i%2)==1)
     {
      printf("%d是奇数\n",i);
     }
    }
    void eachItem(int* pArray,int len,void (*action)(int))
    {
     int i = 0;
     for(i=0;i<len;i++)
     {
      action(*(pArray+i));
     }
    }
    int main(int argc, char *argv[])
    {
     int arr[5] = {3,5,8,2,1};
     int len = sizeof(arr)/sizeof(int);
     eachItem(arr,len,PrintIt);
     eachItem(arr,len,PrintOdd);
    }
    10、指针数组、指针的指针。
    指针数组的经典用途就是声明字符串数组:
     static char *name[]={"Monday",
                            "Tuesday",
                            "Wednesday",
                            "Thursday",
                            "Friday",
                            "Saturday",
                            "Sunday"};
    这两部分请同学们参考教材。
    11、结构指针
    对结构的访问一般形式为:
    结构变量.成员名
        (*结构指针变量).成员名
    或为:
        结构指针变量->成员名
        应该注意(*pstu)两侧的括号不可少,因为成员符“.”的优先级高于“*”。
    12、结构指针变量作函数参数
    允许用结构变量作函数参数进行整体传送。但是这种传送要将全部成员逐个传送,特别是成员为数组时将会使传送的时间和空间开销很大,严重地降低了程序的效率。因此最好的办法就是使用指针,即用指针变量作函数参数进行传送。
    13、动态存储分配
    注:“C语言中不允许动态数组”是C89标准中的规定,所以TC、VC6等C89等老的编译器会有这个问题,新的C99中已经不存在这个问题。
    C语言中不允许动态数组类型。例如下面的代码是错误的:
    int n;
    scanf("%d",&n);
    int a[n];
    但是在实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据。对于这种问题,用数组的办法很难解决。为了解决上述问题,C语言提供了一些内存管理函数,这些内存管理函数可以按需要动态地分配内存空间,也可把不再使用的空间回收。
    (1)分配内存空间函数 malloc
    调用形式:
      (类型说明符*)malloc(size)
      功能:在内存的动态存储区中分配一块长度为"size"字节的连续区域。函数的返回值为该区域的首地址。
    (2)释放内存空间函数 free
    调用形式:
    free(void*ptr);Sample Text

    转载于:https://www.cnblogs.com/xiii/p/5014934.html

    展开全文
  • //Sunday算法模板数组赋值,+1防止特征码出现FF时越界 int aSunday[0xFF + 1] = { 0 }; for (int i = 0; i < nSundayLen; i++) {<!-- --> ...
  • 12.1.2 指针变量的定义、赋值与引用 12.2 指针变量的运算 12.3 指针与数组 12.3.1 指针与一维数组 12.3.2 指针与多维数组 12.4 指针与函数 12.4.1 指针作为函数的参数 12.4.2 指向函数的指针 12.4.3 指针型函数 ...
  • Java开发技术大全(500个源代码).

    热门讨论 2012-12-02 19:55:48
    assignTwoDime.java 为二维数组赋值 getMaxElem.java 获取数组中的最大元素 incCapicity.java 演示StingBuffer的容量增长 SortDemo.java 排序示例 travelTwoDime.java 遍历二维数组 traversing.java 遍历一维...
  • 摩托罗拉C++面试题

    2009-08-19 19:52:41
    2.如果用VC开发程序,常见这么几个错误,C2001,c2005,c2011,这些错误的原因是什么。 Answer:  在学习VC++的过程中,遇到的LNK2001错误错误消息主要为:  unresolved external symbol “symbol”(不确定的外部...
  • C++复习资料之系列

    2008-12-30 21:35:45
    后,下面不正确的赋值语句是( b )。 (a) *p2 = b; (b) p1 = a; (c) p2 = p1; (d) c = *p1 *(*p2); 16.执行语句 int a = 10,b;int &pa = a,&pb = b; 后,下列正确的语句是( b )。 (a) &pb = a; ...
  • 2. 枚举变量通常由赋值语句赋值,而不由动态输入赋值。枚举元素虽可由系统或用户定义一个顺序值,但枚举元素和整数并不相同,它们属于不同的类型。因此,也不能用printf语句来输出元素值(可输出顺序值)。 3. 位运算...
  • 第5章 指针、数组和结构 79 5.1 指针 79 5.1.1 零 80 5.2 数组 80 5.2.1 数组初始化 80 5.2.2 字符串文字量 81 5.3 到数组的指针 83 5.3.1 在数组里漫游 83 5.4 常量 85 5.4.1 指针和常量 87 5.5 引用 88 ...
  • 第5章 指针、数组和结构 79 5.1 指针 79 5.1.1 零 80 5.2 数组 80 5.2.1 数组初始化 80 5.2.2 字符串文字量 81 5.3 到数组的指针 83 5.3.1 在数组里漫游 83 5.4 常量 85 5.4.1 指针和常量 87 5.5 引用 88 ...
  • C++程序设计语言(特别版)--源代码

    热门讨论 2012-04-23 07:33:51
    第5章 指针、数组和结构 79 5.1 指针 79 5.1.1 零 80 5.2 数组 80 5.2.1 数组初始化 80 5.2.2 字符串文字量 81 5.3 到数组的指针 83 5.3.1 在数组里漫游 83 5.4 常量 85 5.4.1 指针和常量 87 5.5 引用 88 ...
  • 而要成功编译ExoSIP,似乎许多人被难住了,直接在XP-sp2上,用VC6,虽然你使用了eXoSIP推荐的winsock2.h,但是会得到一个 sockaddr_storage结构不能识别的错误,因为vc6自带的开发库太古董了...
  •  增加静态编译功能,支持挂接第三方链接器(比如VC6中的link.exe)。  静态编译后的易语言可执行程序(exe)和动态链接库(dll),运行时不再依赖任何支持库文件,文件尺寸更小(相对以前的独立编译),PE结构更合理...
  • C#微软培训教材(高清PDF)

    千次下载 热门讨论 2009-07-30 08:51:17
    7.3 赋值操作符和赋值表达式.64 7.4 关系操作符和关系表达式.65 <<page 2>> page begin==================== 7.5 逻辑操作符和逻辑表达式.68 7.6 位 运 算 .69 7.7 其它特殊操作符 .72 7.8 小 结 ....
  • C#微软培训资料

    2014-01-22 14:10:17
    7.3 赋值操作符和赋值表达式.64 7.4 关系操作符和关系表达式.65 <<page 2>> page begin==================== 7.5 逻辑操作符和逻辑表达式.68 7.6 位 运 算 .69 7.7 其它特殊操作符 .72 7.8 小 结 ....
  • C++MFC教程

    热门讨论 2013-05-21 13:37:15
    这样做的目的主要是增加对语言的熟悉程度,同时也训练自己的思维和熟悉一些在编程中常犯的错误。更重要的是理解并能运用C++的各种特性,这些在以后的开发中都会有很大的帮助,特别是利用MFC进行开发的朋友对C++一定...

空空如也

空空如也

1 2
收藏数 27
精华内容 10
关键字:

vc数组赋值错误