空隙指针分割故障



为了了解无效指针的工作原理,我编写了一件代码来测试它。但是,我在运行时得到了细分故障,并且不知道如何处理它。这里的要点是,数据是在该函数调用中生成的。您不知道应该分配数据类型以及该空隙指针有多大。

#include <iostream>
#include <vector>
int valueAssignment(void *ptr1, void *ptr2){
  std::vector<int> vi;
  std::vector<double> vb;
  int num = 10;
  for (size_t i = 0; i < num; i++) {
    vi.push_back((int)rand());
    vb.push_back((double)rand());
    std::cerr <<i<<": "<< vi[i] <<'t'<<vb[i]<<'n';
  }
  for (size_t i = 0; i < num; i++) ((int*)ptr1)[i] = vi[i];
  for (size_t i = 0; i < num; i++) ((double*) ptr2)[i] = vb[i];
  return num;
}
int main(int argc, char const *argv[]) {
  void * intPtr, *doublePtr;
  int size;
  size = valueAssignment(intPtr,doublePtr);
  std::cerr << "/* ------------------- */" << 'n';
  for (size_t i = 0; i < size; i++) {
    std::cout <<i<<": "<< ((int*)intPtr)[i]<<"," <<((double *)doublePtr)[i]<<std::endl;
  }
  return 0;
}

我们应该简单地遵循专家给出的许多建议。

  1. 请勿在C 中使用原始指针
  2. 请勿在C 中使用原始指针
  3. 请勿在C 中使用原始指针

我们已经取得了长足的进步。但是,您想了解void* pointer。无效指针是一种通用指针,可以指向任何东西。您还可以将其他指针类型分配给空隙指针。反之亦然,这是不可能的,您需要一个明确的类型铸件。

在课程和尤其是派生的课程的情况下,您甚至可能会通过进行此类演员来丢失信息。

传统C代码通常使用无效指针,但这基本上没有问题。

在现代C 中,很少需要空隙指针。也许主要是与旧代码接口。

所以,现在您的特殊情况:

在许多评论中已经提到了问题。这与无效的指针无关,而是普遍的指针。您的指针没有初始化。他们指向某个地方,在内存的某个时刻随机。在您的子函数中,您将值分配给那些无活化的指针,将值写入内存中的某个地方。您的程序将Chrash。

因此,指针需要指向定义的某个地方。到定义的内存区域。

您可能已经写了:

    int intArray10[10];        // You should not use C-Style plain arrays
    double doubleArray10[10];  // You should not use C-Style plain arrays
    void* intPtr = intArray10;
    void* doublePtr = doubleArray10;

然后,您的指针将指向定义的区域。而且您的程序将起作用。

,但是您要在功能中定义或以某种方式使用指针。如果已知大小,则可以将数据分配给new并将其分配给指针。然后,指针必须作为"指指指针"或"指针指向指针"。如果尺寸未知,这将更加困难,您需要在大小上通知呼叫程序。

所有这些都非常容易出错,应避免。

再次:不要使用原始指针。如果您确实需要它们来进行某些Ressource管理,请使用std::unique_ptrstd::shared_ptr

或更好地使用STL容器。

最新更新