我想知道为什么我的分配工作正常。我创建ptr
是一个指针,而ptr2
指针位于与ptr
相同的位置。
这是我的代码:
int* ptr = malloc(sizeof(int));
int* ptr2 = ptr;
*ptr2 = 1;
ptr2 = ptr+1;
*ptr2 = 2;
最后,我有一个两个整数的数组:
ptr[0] = 1
ptr[1] = 2
我的问题是:为什么我可以在没有错误或警告的情况下影响值2到ptr2
?我只是malloc()
- 我的数组中的一个整数位置,不是吗?
答案 0 :(得分:4)
这里的问题是,说
for (unsigned long long totalSize = 1MB; totalSize <= 1000MB ; totalSize += 1MB)
{
// create
CComPtr<ID3D11Buffer> pd3dBuffer;
D3D11_BUFFER_DESC bufferDesc;
{
ZeroMemory(&bufferDesc, sizeof(bufferDesc));
bufferDesc.ByteWidth = static_cast<UINT>(bufferSize);
bufferDesc.Usage = D3D11_USAGE_DYNAMIC;
bufferDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
bufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
bufferDesc.MiscFlags = 0;
bufferDesc.StructureByteStride = 0;
}
HRESULT hr = pd3dDevice->CreateBuffer(&bufferDesc, NULL, pd3dBuffer);
if (FAILED(hr)) break;
//release
pd3dBuffer.Release();
pd3dDeviceContext->ClearState();
pd3dDeviceContext->Flush();
}
你指的是出界的记忆。接下来,在您退出时,您会调用undefined behavior。现在,无论如何,UB的结果都是不合理的。
C中没有任何内在的东西阻止你访问出界(或无效)内存,但这样做的结果是UB。
那就是说,只是一个建议,你应该在使用该指针之前检查 ptr2 = ptr+1;
的返回值,以便在malloc()
失败的情况下通过解除引用NULL
指针来避免UB。 / p>