我的一个同学给我发了一个代码,问我怎么了。它是这样的:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *d_array, number, divisor_count, i, size = 1;
char answer;
d_array = (int*) malloc(size * sizeof(int));
do
{
printf("\nEnter a number: ");
scanf("%d", &number);
divisor_count = 0;
for(i = 2; i < number; i++)
if (number % i == 0) divisor_count++;
if(divisor_count == 0)
{
realloc(d_array,(size + 1) * sizeof(int));
d_array[size - 1] = number;
size++;
}
printf("\nIs there another number? y/n ");
getchar();
answer = getchar();
} while (answer == 'y'); …Run Code Online (Sandbox Code Playgroud) 我正在用 C 语言开发一个程序,它使用链表数组(原始哈希表)作为数据类型来表示某些日期信息。该数组有十二个元素对应于一年中的几个月,每个月都有一个包含数据节点的链表。
我开发了使用这种数据类型的模块,它运行良好。后来我发现我正在访问越界的数组元素(例如通过索引 12 而不是 11 访问第 12 个元素)。但该程序始终如一地运行,没有发生任何事故。我从未收到过分段错误。我已经纠正了编码错误。有人能解释为什么访问越界元素不会导致段错误吗?
这已经不是第一次发生了。我创建了一个动态分配的多维数组,为了测试,我尝试访问越界元素。该程序运行良好,产生了准确的结果,并且在大多数情况下不会出现段错误。我唯一一次实现了,我不得不尝试访问实质上越界的元素。
(这些程序目前是用于测试的 Windows 控制台应用程序。我正在使用 MinGW 进行编译。如果有帮助,我可以包含代码。)
考虑这种情况:Form1 构建了一个包含大量元素的 List 对象。然后,它必须通过参数将此集合传递给 Form2。
在 Form2 中制作它的硬拷贝后,我想清除与 Form1 中的集合相关的所有内容。让Col1成为 Form1 中集合的标识符。
由于 Col1 是通过参数通过引用传递的,因此我调用Col1.Clear()来清除它的元素,然后调用 Col1.TrimExcess()将其实际大小减少到 0,因此它不会跟踪大量空值。
我的目的是尽快清除所有使用过的内存。Col1.TrimExcess() 应该清除所有使用的内存,但我很好奇 Col1 = null 在我(或大多数)情况下是否会更好?
我有一个带有原始指针的情况,我无法更改为智能指针,因为它是接口的一部分(我不想破坏使用它的任何代码):
struct Foo
{
Foo();
~Foo();
int * m_pStuff; // public!
};
Run Code Online (Sandbox Code Playgroud)
我不想在我的病人身上做太多事情.就像这样:
m_pStuff = new int[dynamically_obtained_size_which_is_greater_than_0];
m_pStuff[0] = 0;
Run Code Online (Sandbox Code Playgroud)
然后在析构函数中删除它.
现在,我想知道使用try/catch是否值得围绕它:
Foo::Foo()
: m_pStuff(0)
{
try
{
m_pStuff = new int[dynamically_obtained_size_which_is_greater_than_0];
m_pStuff[0] = 0;
}
catch(...)
{
delete m_pStuff;
throw;
}
}
Run Code Online (Sandbox Code Playgroud)
我能看到的观点:
我能看到的要点:
我还是很犹豫:我是否应该尝试使用try/catch?为什么?我想就此提出你的意见.
此外,您是否看到在分配时由于内存不足而导致异常的可能性?在这种情况下,已经分配的内存将被自动回收,对吗?
谢谢!
c++ constructor pointers exception dynamic-memory-allocation
假设我有以下代码:
typedef struct {
int numBars;
BarType *bars;
} fooType;
foo = (fooType *) malloc(sizeof(fooType));
foo->bars = (BarType *) malloc(sizeof(barType));
Run Code Online (Sandbox Code Playgroud)
调用free(foo)也会释放条形码或者我需要这样做:
free(foo->bars);
free(foo);
Run Code Online (Sandbox Code Playgroud)
直观地说,我觉得调用free(富)应该是足够了 - 如果我不需要调用free(foo-> numBars)我不应该需要调用free(foo->条).但是我没有为numBars手动分配内存,而是为了吧.
我在C中实现了一个AVL树.后来我才读到指针比较仅在同一个数组中的对象之间有效.在我的实现中,我做了一些相等的测试.例如,要测试节点是否是我可能测试的父节点的右子节点node==node->parent->right.但是,节点是根据需要分配的,而不是在连续的块中.是否定义了此行为?如果不是,你会如何编写这段代码呢?
我想知道为什么我的分配有效。我创建了ptr哪个是一个指针,ptr2哪个是与ptr.
这是我的代码:
int* ptr = malloc(sizeof(int));
int* ptr2 = ptr;
*ptr2 = 1;
ptr2 = ptr+1;
*ptr2 = 2;
Run Code Online (Sandbox Code Playgroud)
最后,我有一个由两个整数组成的数组:
ptr[0] = 1
ptr[1] = 2
Run Code Online (Sandbox Code Playgroud)
我的问题是:为什么我可以在ptr2没有错误或警告的情况下影响值 2 ?我只malloc()为数组中的一个整数位置设置了 -ed,不是吗?
在这段代码中:
int length = atoi(argv[1]);
char *tab = malloc(length * sizeof(char));
memset(tab, '-', length);
puts(tab);
Run Code Online (Sandbox Code Playgroud)
无论我传递什么价值argv[1],输出都是正确的.例如,argv[1] = "5"我得到-----(五个连字符).
我想知道puts()当我没有在我的数组的末尾放置'\ 0'时如何找到输入字符串的结尾char.
此代码不动态分配内存,不会在窗口上显示任何标签.
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
QLabel l;
l.setText ("cdsadsaf");
l.setParent (this);
}
Run Code Online (Sandbox Code Playgroud)
动态分配内存后,标签会显示出来.
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
QLabel *label = new QLabel(this);
label->setText("first line\nsecond line");
}
Run Code Online (Sandbox Code Playgroud)
为什么QLabel必须使用动态内存分配?
在下面的类中,承包商应该从main函数中获取一个字符串和int("Jan",24).但是当传递整数时,似乎有一些错误,因为另一个随机整数(如1)会被打印为年龄.
#include <iostream>
#include <string>
using namespace std;
class Human{
private:
string *name;
int *age;
public:
Human(string iname, int iage){
name = new string;
age = new int;
name = &iname;
age = &iage;
}
void display(){
cout << "Hi I am "<<*name<<" and i am "<<*age<<" years old"<<endl;}
~Human(){
delete name;
delete age;
cout << "all memories are released"<<endl;
}
};
int main()
{
Human *Jan = new Human("Jan",24);
Jan->display();
delete Jan;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出如下,打印年龄而不是24岁.任何想法为什么?
Hi I am …Run Code Online (Sandbox Code Playgroud)