我正在尝试掌握指针的想法但却无法掌握它。为什么此代码会为s
分配正确的值,但在我尝试在t
上使用它时会产生运行时错误。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *s;
char *t;
printf("s: ");
scanf("%s", s);
printf("t: ");
scanf("%s", t);
return 0;
}
答案 0 :(得分:1)
您已为char指针动态分配内存,否则无效。未初始化的指针有垃圾。
//a macro to hold the size of the array.
#define DIM 12
char *s = malloc(sizeof(char) * DIM);
char *t = malloc(sizeof(char) * DIM);
printf("s: ");
scanf("%s", s);
printf("t: ");
scanf("%s", t);
当你完成它时,不要忘记从堆中释放内存。
free(t);
free(s);
如果您不想在堆上分配内存,那么您可以使用在scanf
使用后不必释放的char数组:
char t[DIM];
char s[DIM];
答案 1 :(得分:1)
指针的想法是它们允许scanf
等函数分配给它们指向的对象(因此名称指针倾向于指向事情)。但是,与其他变量一样,需要初始化它们!
假设你有一个函数add_one
,它会增加它的参数:
void add_one(int x) {
x++;
}
此功能无效,因为它对x
所做的更改对调用者来说是不可见的,因为这个概念称为按值传递,其中传入的值的副本,最终会被修改(因此原始保持不变)。
您需要使x
指针在add_one
之外显示更改,并且scanf
需要进行相同的更改。
void add_one(int *x) {
(*x)++; // equivalent to x[0]++;
}
当然,如果x
实际上并没有指出某些内容,那么这项工作就不会奏效!在您的示例中,您已获得未初始化的指针变量;他们指着......什么都没有?什么?谁在乎? 让他们指向某个地方!
您可以通过以下方式执行此操作:
在变量上使用&
address-of运算符。例如:
int x;
int *pointer_to_x = &x;
声明一个数组,并使用数组的标识符,可能与+
加法运算符一起指向数组中的元素。例如:
int array[42];
int *pointer_to_first = array + 0;
int *pointer_to_second = array + 1;
调用malloc
,realloc
,calloc
或其他一些返回指向适当大小的对象的指针的函数。例如:
int *pointer_to_whatever = malloc(sizeof *pointer_to_whatever);
// Remember to free(pointer_to_whatever) ONCE when you're done with it