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]
一样?
答案 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。