指向数组的初始化指针

时间:2019-02-06 22:45:09

标签: c pointers

    scanner.useDelimiter("[;\r\n]");

    while (scanner.hasNext()) {
        Item item = new Item();
        item.setID(scanner.nextInt());
        item.setName(scanner.next());
        item.setQuantity(scanner.nextInt());
        item.setPriceInCents((int) scanner.nextFloat()*100);
        item.setSupplierID(scanner.nextInt());
    }

为什么第一行代码在第二行中失败,而第二行代码正常工作, //1 char** p; p[0]="Test"; //2 char** array; array = realloc(array, sizeof(char*)*((*size)+1)); array[*size] = (char*)malloc(sizeof(char)*(strlen(input)+1)); 就像array[*size]一样?

1 个答案:

答案 0 :(得分:1)

检查代码:

char **p; // Declared, but uninitialized
p[0] = "test"; // Setting value to it?

p未初始化,因此,尝试使用它访问和设置内存是UB或未定义的行为。失败比潜在的替代方案要好得多。

对于第二段代码,假设大小是某些代码段中未包含的指针。

char** array
array = realloc(array, sizeof(char*)*((*size)+1)); // Allocating. 
array[*size] = (char*)malloc(sizeof(char)*(strlen(input)+1));

因此,严格来说,用未初始化的指针调用realloc是UB,偶然的机会等于Null

请注意:

  

如果ptr为NULL,则其行为与调用malloc(new_size)相同。

这样,realloc将分配一块内存并将其传递给数组。

然后,取消引用指针(不再指向Null,而是内存中的有效点),并对其进行malloc,这不会崩溃。

从最好的猜测来看,虽然这是未定义的行为,但在两种情况下p都可能为Null,并且第一个尝试取消引用时会崩溃,第二个成功获取malloc。