作为C的初学者,我仍然对神奇的“指针”概念感到困惑
例如,这是一个简单的代码,可以在数组“ range1”中存储1到10个
int *range1;
int max = 10;
int count = 0;
range1 = malloc(sizeof(int) * (11));
while (count < max)
{
range1[count] = count;
count++;
}
range1[count] = '\0';
这很好,但是
int *range1;
int max = 10;
int count = 0;
range1 = malloc(sizeof(int) * (11));
while (count < max)
{
*range1 = count;
count++;
range1++;
}
range1[count] = '\0';
这不是。我得到
[1] 24934 segmentation fault
我很困惑,因为我以为*(range1 + count)= range1 [count]。
如何更改第二个示例,使其运行而不会产生细分冲突。
答案 0 :(得分:7)
使用
range1++;
不建议使用,除非您有另一个变量存储malloc
返回的值。没有这样的变量,您将丢失原始指针。呼叫free
将是一个问题。
此外,如果您继续使用
range1[11] = '\0';
循环后,您正在访问和修改不应在内存中的位置。这会导致不确定的行为。
PS
的使用
range1[11] = '\0';
即使使用第一种访问range1
元素的方法,也是一个问题。分配11个元素时,10是最高有效索引。
答案 1 :(得分:1)
我的猜测是,您尝试在将range1递增后使用它。您应该保留原始指针的副本以打印数组并释放内存。
请参见下面的代码,内嵌注释:
#include <stdio.h>
#include <stdlib.h>
int
main(void)
{
int *range1, *range2;
int max = 10;
int count = 0;
range1 = malloc(sizeof(int) * 11);
range2 = range1;
printf("\nstart Test 1 -- array\n");
while (count < max)
{
range1[count] = count;
count++;
}
range1[10] = '\0'; // index 11 is out of bounds
// Also this is not something you'd usually do in with an array of integers.
// It is commonly done with character arrays representing strings because
// strings are NUL terminated.
for(int i=0; i < max; i++) {
printf("%d: %d\n", i, range1[i]);
}
printf("\nstart Test 2 -- ptr incr\n");
range2 = range1; // need to work with a copy and keep range 1 to print and free memory
while (count < max)
{
*range2 = count;
count++;
range2++;
}
for(int i=0; i < max; i++) {
printf("%d: %d\n", i, range1[i]);
}
free(range1);
}
输出:
start Test 1 -- array
0: 0
1: 1
2: 2
3: 3
4: 4
5: 5
6: 6
7: 7
8: 8
9: 9
start Test 2 -- ptr incr
0: 0
1: 1
2: 2
3: 3
4: 4
5: 5
6: 6
7: 7
8: 8
9: 9