0

我知道您可以通过指针间接传递值:您指定将某个地址(指针)处的值(*)分配为等于某物(例如字符)。

// This works: I can pass char indirectly via pointers    
// by saying "value at char pointer line equals c1 or c2"

char c1 = 'a';
char c2 = 'b';
char* line;

*line = c1;    
*(line+1) = c2;

我可以使用上面的 *(line+1) 向右滑动内存空间。但是,当我循环它时,这会失败(如下):

// Output: "Process returned -1073741819 (0xC0000005)"    
// Why?   

char c;    
char* line1;    
int i = 0;

while ((c = getchar()) != EOF){
    *(line1+i) = c;    
    i++;    
}

输出:“进程返回 -1073741819 (0xC0000005)”

当我尝试在 while 循环中迭代时,为什么无法通过指针间接传递值?非常感谢!

4

4 回答 4

3
  1. 您无法为 line1 赋值,因为您从未对其进行初始化。
  2. 您正在访问不应该使用 line+i 的内存

也许你想要这样的东西:

char c;

char array[100];   // Allocate space for 100 chars

char* line1 = array;    // Pointer to allocated memory block

int i = 0;

while ((c = getchar()) != EOF)

{

    *(line1+i) = c;

    i++;
    // Exit when i == 100
}
于 2012-10-18T13:58:12.840 回答
0

您永远不会为 line1 分配地址,即将它指向某处或分配它指向的缓冲区。

于 2012-10-18T13:57:56.447 回答
0

如果您没有正确初始化 line1,那么它就无法工作。

尝试char line1[500];而不是char* line1;- 仅用于测试;如果输入超过 500 个字符,它仍然会崩溃。

于 2012-10-18T14:00:20.490 回答
0

Line1 没有用任何东西初始化。它指向的地址是未定义的。

在 C(或 C++)中,当您将变量声明为指针类型时,不会自动为该变量分配有效地址。像这样的东西。

DataType *a_certain_ptr;

你认为 a_certain_ptr 包含什么?另一个例子可能会给你一个提示。

int a_certain_number;    // this line is in some function.

a_certain_number 的值是多少?

不难看出 a_certain_number 可以是任何东西,它是未初始化的,因此它的值是未定义的。它可以等于 1、-1 或 15033 等。

同样适用于 a_certain_ptr。现在这个变量,因为你不初始化它,可以包含任何值。它可以是 1、-1、353210,甚至可能是指向堆栈中某处的有效地址...

所以稍后当你试图执行

*(line1+i) = c;

您指的是由i*sizeof(char)字节偏​​移的无效地址,它仍然无效....

于 2012-10-18T14:20:41.797 回答