为啥这段代码不打印我的数组?

     2023-02-21     145

关键词:

【中文标题】为啥这段代码不打印我的数组?【英文标题】:Why isn't this code printing my array?为什么这段代码不打印我的数组? 【发布时间】:2011-08-15 18:11:15 【问题描述】:

我在这里有一个整数数组排序程序,但我遇到了一个问题:每当我运行该程序时,我有时会收到“变量 'numbers' 周围的堆栈已损坏”消息,有时它只是重复打印出数字 8。这是我的代码(在 Visual C++ 2010 中编译):

#include <iostream>
#include <cstdlib>
using std::cout;
using std::endl;

void swap(int *x, int *y)

    int tmp=0;
    tmp = *x;
    *x  = *y;
    *y  = tmp;
    tmp = 0;


int main()

    int numbers[13] = 8,16,23,487,2,301,48,0,13,10,644,12;

    int size = sizeof(numbers) / sizeof(int);

    //sort

    int i = 0;
    int* a = &numbers[0];
    int* b = &numbers[1];


    while(i < size)

        if(*a > *b)
            swap(a, b);
        

        *a++;
        *b++;
         i++;
    

    //Print our results
    int loopIterator = 0;
    int numToPrint = 0;
    while(loopIterator < size)
        cout << numbers[numToPrint] << endl;
        loopIterator++;
    


    system("PAUSE");


【问题讨论】:

和主说:整数应该永远是4... sigh,使用sizeof(int)。 int size = sizeof(numbers) / sizeof(int); 上述两种解决方案都不是最优的。更好:size_t size = sizeof numbers / sizeof numbers[0]; 【参考方案1】:

首先,您永远不会增加numToPrint,因此您永远不会打印超过numbers[0] 的值。至少将您的代码更改为:

while(loopIterator < size)
    cout << numbers[numToPrint++] << endl;
    loopIterator++;

其次,由于您的 while 循环使用测试 i &lt; size,因此在循环的最后一次迭代中,您将访问 numbers 之外的内存以获取您的 b 指针,并可能交换它值到numbers 的最后一个槽中(即a 指向的位置)。您想将测试更改为 i &lt; (size - 1) 以避免这种情况。例如,如果在i == 0 你有a = &amp;numbers[0]b = &amp;numbers[1],那么到i == 12 的时候,你最终会得到a = &amp;numbers[12]b = &amp;numbers[13] ... b 的值在这种情况下指向的是数组的末尾。根据您的编译器如何设置堆栈,以及您在堆栈上分配numbers 的方式,如果您最终以b 指向激活记录数据结构,这实际上可能会对您的程序造成一些破坏你的main() 函数,并反过来破坏它。

【讨论】:

为什么有两个索引?如果他想要一个计数环,他应该使用一个计数环。即for(int i(0); i &lt; size; ++i) cout &lt;&lt; numbers[i] &lt;&lt; endl; 这也行……我只是指出他的代码中的一个错误,以及一个快速修复它的方法,它只增加了两个字符。【参考方案2】:

我假设您将数组排序作为练习来实现。这并不能真正回答您的问题,但我想我会发布以供参考,无论如何。这是使用 STL 实现预期结果的一种方法:

#include <iostream>
#include <algorithm>
#include <iterator>

int main()

  int numbers[] =  8, 16, 23, 487, 2, 301, 48, 0, 13, 10, 644, 12 ;
  size_t const size = sizeof(numbers) / sizeof(numbers[0]);

  int * const begin = numbers;
  int * const end   = numbers + size;

  std::sort(begin, end);
  std::copy(begin, end, std::ostream_iterator<int>(std::cout, "\n"));

【讨论】:

支持 STL。顺便说一句,他还可以使用 std::set 容器并将整个程序缩减到 2 行。【参考方案3】:

我很确定您在这里遇到了运算符优先级问题:

*b++;

事实上,编译器应该警告你一个没有副作用的运算符(*)。

除此之外,指针 b 将离开数组的末尾,因为它从元素 1 开始并提前 size 次,它最终将指向 numbers[size+1]。如果编译器优化了无用的取消引用,那不会有问题,但在上一次传递中,您调用 swap(numbers+size-1, numbers+size) 并注销数组的末尾,从而导致您检测到的堆栈损坏。

【讨论】:

【参考方案4】:

嗯,我立即跳出来的一件事是你永远不会增加 numToPrint,所以它会打印出 numbers[0],size 次数。

我会把你的印刷部分改写成

for (int i = 0; i < size; i++)
    cout << numbers[i] << endl;

这样您就可以摆脱代码的打印结果部分,因为上面是做同样事情的更简洁的方法。

您收到的错误消息可能是因为您正在写入不应该触摸的内存部分。这可能是错误使用“sizeof”的结果。它返回数字中的元素数量,而不是内存大小。建议在实际问题上检查 cmets,以获得第二个问题的正确解决方案。

【讨论】:

请注意,这是 OP 报告的两个错误之一;) 嘿,是的,只是解决了我确定看到的一件事,继续编辑以回答这两个问题,解决了错误使用 sizeof 转到 yi_H 的方法。【参考方案5】:

这种排序不起作用,因为你只遍历你的数字列表一次,所以它会交换相邻的项目,但不会对列表进行排序(它是冒泡排序的一半实现)

【讨论】:

sizeof numbers 是以字节为单位的大小,而不是元素。除以元素的大小是正确的(应该计算,例如sizeof numbers[0] 好吧,在它锁定之前,我太慢了,无法取消投票。不过,您的回答仍然没有真正回答问题。

为啥这段代码不简单地打印字母 A 到 Z?

】为啥这段代码不简单地打印字母A到Z?【英文标题】:Whydoesn\'tthiscodesimplyprintlettersAtoZ?为什么这段代码不简单地打印字母A到Z?【发布时间】:2011-05-0503:26:07【问题描述】:<?phpfor($i=\'a\';$i<=\'z\';$i++)echo"$i\\n";这个sn-p给出以... 查看详情

我想反转我的数组。为啥这段代码给出垃圾值?

】我想反转我的数组。为啥这段代码给出垃圾值?【英文标题】:Iwantedtoreversemyarray.Whythiscodegivesgarbagevalue?我想反转我的数组。为什么这段代码给出垃圾值?【发布时间】:2020-05-2220:18:17【问题描述】:#include<iostream>usingnames... 查看详情

为啥代码不能打印这个二维数组的元素?

】为啥代码不能打印这个二维数组的元素?【英文标题】:Whycantthecodeprinttheelementsofthis2darray?为什么代码不能打印这个二维数组的元素?【发布时间】:2018-02-0613:49:00【问题描述】:好的,所以我编写了这段代码来打印二维数组... 查看详情

了解汇编、nasm、x86 中的 printf 函数。我不知道为啥这段代码没有打印出任何东西

】了解汇编、nasm、x86中的printf函数。我不知道为啥这段代码没有打印出任何东西【英文标题】:Understandingtheprintffunctioninassembly,nasm,x86.Idon\'tknowwhythiscodeisn\'tprintinganythingout了解汇编、nasm、x86中的printf函数。我不知道为什么这段代... 查看详情

为啥这段代码使用 Math.pow 打印“HELLO WORLD”?

】为啥这段代码使用Math.pow打印“HELLOWORLD”?【英文标题】:WhydoesthiscodeusingMath.powprint"HELLOWORLD"?为什么这段代码使用Math.pow打印“HELLOWORLD”?【发布时间】:2018-10-3106:27:27【问题描述】:我发现了以下代码。我知道,它... 查看详情

检查数组是不是具有特定字符,为啥我的代码不起作用?

】检查数组是不是具有特定字符,为啥我的代码不起作用?【英文标题】:Checkingifanarrayhasacertaincharacter,whyismycodenotworking?检查数组是否具有特定字符,为什么我的代码不起作用?【发布时间】:2013-02-1511:24:50【问题描述】:您好... 查看详情

为啥数组不打印第一个元素?

】为啥数组不打印第一个元素?【英文标题】:Whyisthearraynotprintingtheveryfirstelement?为什么数组不打印第一个元素?【发布时间】:2019-12-3016:30:41【问题描述】:我正在尝试实现一个行为类似于C++中的字符串数组的类。这是该类的... 查看详情

为啥我的动态数组可以在不调整大小的情况下工作? [复制]

】为啥我的动态数组可以在不调整大小的情况下工作?[复制]【英文标题】:Whydoesmydynamicarrayworkwithoutbeingresized?[duplicate]为什么我的动态数组可以在不调整大小的情况下工作?[复制]【发布时间】:2021-12-1303:03:01【问题描述】:我... 查看详情

c ++为啥在指数时不打印所有元素

】c++为啥在指数时不打印所有元素【英文标题】:c++whydontprintallelementswhenexponentc++为什么在指数时不打印所有元素【发布时间】:2017-12-2710:51:13【问题描述】:我想创建一个数组并将该数组中的每个元素提升2并将其存储为新数组... 查看详情

为啥我的这段python代码运行不出来结果,也没报错,跪求大神指点

importsysimportosimportrandomimportnetworkxasnximportmatplotlib.pyplotaspltfromnetworkx.generators.classicimportempty_graphdebug=True#定义一个方法,它有两个参数:n-网络节点数量;m-每步演化加入的边数量defbarabasi_albert_graph(n,m):#生成一个包含m个节点的空图(... 查看详情

为啥 cout 打印 char 数组与其他数组不同?

】为啥cout打印char数组与其他数组不同?【英文标题】:Whydoescoutprintchararraysdifferentlyfromotherarrays?为什么cout打印char数组与其他数组不同?【发布时间】:2009-02-0123:19:33【问题描述】:我正在使用C++来了解指针的工作原理。我有这... 查看详情

为啥这段代码会打印出无穷大的数字? [关闭]

】为啥这段代码会打印出无穷大的数字?[关闭]【英文标题】:Whydoesthiscodeprintinfinitenumbers?[closed]为什么这段代码会打印出无穷大的数字?[关闭]【发布时间】:2022-01-1016:36:08【问题描述】:在这段代码中,为什么当我在x1=Chain("6"... 查看详情

为啥这段代码输出这么多数字? [复制]

】为啥这段代码输出这么多数字?[复制]【英文标题】:Whyisthiscodeoutputtingsomanynumbers?[duplicate]为什么这段代码输出这么多数字?[复制]【发布时间】:2019-06-2218:26:55【问题描述】:从两个数组a和b开始,我试图输出一个矩阵c,其... 查看详情

If x == y: print z - 为啥我的代码不打印? [复制]

】Ifx==y:printz-为啥我的代码不打印?[复制]【英文标题】:Ifx==y:printz-Whywon\'tmycodeprint?[duplicate]Ifx==y:printz-为什么我的代码不打印?[复制]【发布时间】:2021-02-2720:18:41【问题描述】:我对编码有点陌生。我正在做一个测验,我从csv... 查看详情

为啥我的函数在 python 中没有打印 [重复]

】为啥我的函数在python中没有打印[重复]【英文标题】:Whyismyfunctionnprintingnoneinpython[duplicate]为什么我的函数在python中没有打印[重复]【发布时间】:2021-01-0506:29:41【问题描述】:我写了这段代码deffunction1():message="Iamfunction1"deffunct... 查看详情

为啥这段代码没有收到我的广播?

】为啥这段代码没有收到我的广播?【英文标题】:Whymybroadcastisnotreceivedinthiscode?为什么这段代码没有收到我的广播?【发布时间】:2015-09-0715:37:13【问题描述】:为什么这段代码没有收到我的广播?我在下面发布我的代码。当... 查看详情

为啥我的打印功能不起作用?链表

】为啥我的打印功能不起作用?链表【英文标题】:Whyismyprintfunctionnotworking?Linkedlist为什么我的打印功能不起作用?链表【发布时间】:2020-01-0817:55:41【问题描述】:我正在做一个班级作业,我必须创建一个代表一个大数字的链... 查看详情

为啥我的程序不打印 switch case 之后的代码?它在 switch case 执行后结束,就是这样

】为啥我的程序不打印switchcase之后的代码?它在switchcase执行后结束,就是这样【英文标题】:Whymyprogramdoesnotprintthecodethatcomesaftertheswitchcase?Itendsafterswitchcaseisexecutedandthatisit为什么我的程序不打印switchcase之后的代码?它在switchcase... 查看详情