相关疑难解决方法(0)

为什么编译器不会抱怨访问超出动态数组边界的元素?

我正在定义一个大小为9的数组.但是当我访问数组索引10时,它没有给出任何错误.

int main() {
   bool* isSeedPos = new bool[9];
   isSeedPos[10] = true;
}
Run Code Online (Sandbox Code Playgroud)

我期望得到编译器错误,因为isSeedPos[10]我的数组中没有数组元素.

为什么我没有收到错误?

c++

-1
推荐指数
1
解决办法
579
查看次数

为什么这不会产生分段错误

这是c ++中的for循环.我不明白为什么它不会在执行时给出分段错误.

int main() 
{
   int arr[5];
   for (int x = 0; x <= 5; x++)
       {
           arr[x] = x;
       }
   return 0; 
}
Run Code Online (Sandbox Code Playgroud)

c++

-1
推荐指数
1
解决办法
222
查看次数

Segfault不会发生

我有以下c代码:

#include <stdint.h>
#include <stdio.h>

int main (){
    uint8_t *array;
    int i=0;
    for(;i<32120;i++)
        printf("Array[%d] = %d \n",i,*(array+i));
}
Run Code Online (Sandbox Code Playgroud)

因为我没有为数组声明内存,所以我希望这个代码在第二次迭代时会出现段错误,但情况并非如此(它发生在我的覆盆子上的i == 3295,以及我的debian虚拟机上更大的随机值.

我在这里错过了什么吗?

ps:用gcc版本4.9.2编译(Debian 4.9.2-10)

c memory segmentation-fault

-1
推荐指数
1
解决办法
117
查看次数

不明白array-1的含义

我有理解这段代码的问题,尤其是"vet-1"部分.这是什么意思?它返回的数组项目是什么?谢谢

#include <stdlib>
#include <iostream>

using namespace std;

void change( int m, int n[7]);

int main(){
int vet[] = {1,2,3,4,5};
change(vet[4],vet-1);
change(0,&vet[4]);
int i=0;
for (i=0;i<5;i++) cout << vet[i];
return 0;
}

void change( int m, int n[7]) {
(*(n+m))--; m++; n--;
}
Run Code Online (Sandbox Code Playgroud)

c c++ arrays

-1
推荐指数
1
解决办法
113
查看次数

返回 C++ 中的字符串数组、长度和损坏

我是一名 .NET 人员,正在深入研究 C++/微控制器领域。

以下是我正在尝试做的事情的模型。我有一个传入值的方法,并且根据该值我想返回一个不同的硬编码字符串数组。

当我单步执行此操作时,我的函数main()似乎可以工作,并且看起来我正在函数中返回正确的类型。我可以设置一个断点并查看files[0]是否是预期的字符串,files[1]是否是预期的字符串等。我可以单步执行循环并设置监视,files[i]然后我会看到适当的字符串。那里一切都很好。

那么两个问题:如何获取数组中有多少个元素?看了一百万个帖子,看来我做不到,对吧?我是否只需要一些在循环时需要检查的结束字符串(例如空字符串)?

其次,你会注意到我已经注释掉printf()了。当我启用该功能后,在单步执行后printf(),它会更改字符串的内容,但我不明白为什么要这样做。查看逐步执行之前/之后的图像以及手表的结果。我认为这可能是因为字符串没有以 a 隐式终止\0,但这没有效果。

#include <cstdlib>
#include <cstdio>

const char** GetSoundCategory(int category)
{
    const char* FILES1[3] = {
        "/myfile1.mp3",
        "/this_is_my_file.mp3",
        "/myfile9.mp3"
    };

    const char* FILES2[2] = {
        "/I love S.E.mp3",
         "/please_help_me.mp3"
    };   

    const char** ptr = nullptr;

    switch (category)
    {
        case 1:
            ptr = FILES1;
            break;
        case 2:
            ptr = FILES2;
            break;
    }
    return ptr;
}

int main()
{
    const …
Run Code Online (Sandbox Code Playgroud)

c++ visual-c++

-1
推荐指数
1
解决办法
91
查看次数

"int*a = new int"和"int*a = new int [5]"之间有什么区别?

我知道"int*a = new int"用于分配内存以包含int类型的单个元素."int*a = new int [5]"用于分配int类型的元素的块(数组).但是当我运行此代码时

int *a=new int;
for(int i=0;i<4;i++)
   a[i]=i;
for(int i=0;i<4;i++)
   cout<<a[i]<<endl;
Run Code Online (Sandbox Code Playgroud)

它运行没有任何错误,并显示正确的输出,所以什么时候应该使用"int*a = new int [5]"?或者它们在使用方面是否相同?我在codeblocks中使用gnu c ++编译器.

c++

-2
推荐指数
1
解决办法
662
查看次数

堆内存损坏

int main()
{
    char *p = new char[100];
    strcpy(p, "Test");
    cout << "Before heap corruption: " << p << endl;
    p[150] = '\0';

    cout << "after heap corruption: " << p;

    delete p;

    getchar();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在上面提到的代码中,我在一个不是我的内存位置写'\ 0',即使这样也没有抛出异常.如果使用注释delete p运行上面的代码,则不会抛出任何异常.但是如果它被取消注释,则抛出附加的异常.因此,删除可验证内存所有权.那么,我是否可以知道eaxctly删除是如何工作的以及为什么在写出内存块时有很多验证

在此输入图像描述

c++ windows heap memory-management

-2
推荐指数
1
解决办法
542
查看次数

使用变量num时,变量堆栈会被破坏

当使用变量num时,我在访问第9个索引时遇到堆栈损坏的错误,但是当我使用任何其他名称访问时,它会出错.请解释我这种含糊不清的地方.

#include<iostream>
#include<iomanip>
using namespace std;
const int SIZE = 9;

class A
{
private:

    int num[SIZE];
    int num_2[SIZE];
public:
A()
{
    for(int i = 1 ; i <= 9 ; i++)
    {
        num_2[i] = i;
    }  
}
};
void main()
{
    A obj;
}
Run Code Online (Sandbox Code Playgroud)

c++

-2
推荐指数
1
解决办法
46
查看次数

下标运算符中不会发生无符号下溢,为什么?

我一直认为下一个例子是未定义的行为(访问数组越界):

int main()
{
    int* a= new int[3];
    a[0] = 100;
    a++;
    
    unsigned long index = 0;
    
    printf("%d\n", a[-1]);
    printf("%d\n", a[index - 1]);
    printf("%ul\n", index - 1);
}
Run Code Online (Sandbox Code Playgroud)

然而,这个输出很好:

100
100
4294967295l
Run Code Online (Sandbox Code Playgroud)

为什么下标运算符不会发生下溢?

c++ integer-overflow

-3
推荐指数
1
解决办法
176
查看次数

因为某些原因,循环继续

#include <iostream>

using namespace std;

int main()
{
    int lists[30];
    lists[30] = 30;
    lists[0] = 31;
    cout << lists[30];
    cout << "\n";
    cout << lists[0];
    for(int a = 0; a < lists[30]+lists[0]; a++)
    {
        cout << "\n";
        cout << lists[2];
    }
}
Run Code Online (Sandbox Code Playgroud)

在for循环之后,它应该只显示列表[2]的值61次; 列表[30] = 30并列出[0] = 31,所以组合它们是61. for循环中的表达式是否有效?它似乎永远循环.

c++ loops for-loop

-4
推荐指数
1
解决办法
71
查看次数

新char []的C++问题

有人可以向我解释,为什么在char tab []中有4个额外的插槽,当我只询问3个?如何摆脱它们?我在Visual Studio 2017中编码.编辑:第一个程序非常基本,没有显示我的意图.所以,有一个扩展的.

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    int i, n;
    vector<char> input;
    char chp;
    cout << "Enter a expression" << endl;
    while (1)
    {
        cin.get(chp);
        if (chp == '\n') break;
        input.push_back(chp);
    }
    n = input.size();
    char* tab = new char[n] {};
    for (i = 0; i < n; i++)
    {
        tab[i] = input[i];
    }
    int l = strlen(tab);
    for (int i = 0; i < l; i++) 
    {
        cout << "tab[" << …
Run Code Online (Sandbox Code Playgroud)

c++ char dynamic-tables new-operator

-6
推荐指数
1
解决办法
85
查看次数