将指针传递给 scanf() 会产生分段错误
Passing a pointer to scanf() produces segmentation fault
这段代码有什么问题?
void input(int *nmbrOfUnits);
int main() {
int *nmbrOfUnits;
input(nmbrOfUnits);
}
void input(int *nmbrOfUnits) {
printf("numnber if units: ");
scanf(" %d", nmbrOfUnits);
}
编辑:变量是在 main 中创建的,这应该意味着如果 main 调用输入变量不会从堆栈中弹出。为什么要在堆上分配呢?
我传递一个指针并在 scanf 中使用它。为什么我会在这里出现分段错误?
在你的代码中
int *nmbrOfUnits = 0;
不会使 nmbrOfUnits
指向 有效 内存位置 从 或 读取写入。要正确使用,需要先为指针分配内存。您可以通过两种方式做到这一点。
- 使用动态内存分配
malloc()/calloc()
示例代码:free()
部分省略
int *nmbrOfUnits = malloc(sizeof(int));
int * input(int *nmbrOfUnits) {
if (!nmbrOfUnits)
{
exit(-1);
}
printf("numnber if units: ");
scanf(" %d", nmbrOfUnits);
return nmbrOfUnits ;
}
- 分配一些编译时定义变量的地址。
示例代码:
int variable = 0;
int *nmbrOfUnits = &variable;
然后,传递给其他函数。
nmbrOfUnits
未初始化,因此指向随机内存位置。写入此类位置可能会导致程序崩溃或运行异常。
在写入之前,您需要先分配内存。
int *nmbrOfUnits = malloc(sizeof(int));
指针应指向将写入值的内存。例如
int *nmbrOfUnits = malloc( sizeof( int ) );
或
int x;
int *nmbrOfUnits = &x;
另一种方法是让函数自己分配指针指向的内存。例如
void input( int **nmbrOfUnits )
{
*nmbrOfUnits = malloc( sizeof( int ) );
if ( *nmbrOfUnits != NULL )
{
printf( "numnber if units: " );
scanf( " %d", *nmbrOfUnits );
}
}
//...
int *nmbrOfUnits;
//...
input( &nmbrOfUnits );
您有两个变量,都称为 nmbrOfUnits。这可能会对您指的是哪个变量造成很多混淆。
如果希望变量是全局的,正确的写法是:
int g_nmbrOfUnits;
void input(int *p_nmbrOfUnits) {
printf("numnber if units: "); //typos in the original
scanf("%d", p_nmbrOfUnits);
}
然后在另一个函数中:
input(&g_nmbrOfUnits);
这段代码有什么问题?
void input(int *nmbrOfUnits);
int main() {
int *nmbrOfUnits;
input(nmbrOfUnits);
}
void input(int *nmbrOfUnits) {
printf("numnber if units: ");
scanf(" %d", nmbrOfUnits);
}
编辑:变量是在 main 中创建的,这应该意味着如果 main 调用输入变量不会从堆栈中弹出。为什么要在堆上分配呢? 我传递一个指针并在 scanf 中使用它。为什么我会在这里出现分段错误?
在你的代码中
int *nmbrOfUnits = 0;
不会使 nmbrOfUnits
指向 有效 内存位置 从 或 读取写入。要正确使用,需要先为指针分配内存。您可以通过两种方式做到这一点。
- 使用动态内存分配
malloc()/calloc()
示例代码:free()
部分省略
int *nmbrOfUnits = malloc(sizeof(int));
int * input(int *nmbrOfUnits) {
if (!nmbrOfUnits)
{
exit(-1);
}
printf("numnber if units: ");
scanf(" %d", nmbrOfUnits);
return nmbrOfUnits ;
}
- 分配一些编译时定义变量的地址。
示例代码:
int variable = 0;
int *nmbrOfUnits = &variable;
然后,传递给其他函数。
nmbrOfUnits
未初始化,因此指向随机内存位置。写入此类位置可能会导致程序崩溃或运行异常。
在写入之前,您需要先分配内存。
int *nmbrOfUnits = malloc(sizeof(int));
指针应指向将写入值的内存。例如
int *nmbrOfUnits = malloc( sizeof( int ) );
或
int x;
int *nmbrOfUnits = &x;
另一种方法是让函数自己分配指针指向的内存。例如
void input( int **nmbrOfUnits )
{
*nmbrOfUnits = malloc( sizeof( int ) );
if ( *nmbrOfUnits != NULL )
{
printf( "numnber if units: " );
scanf( " %d", *nmbrOfUnits );
}
}
//...
int *nmbrOfUnits;
//...
input( &nmbrOfUnits );
您有两个变量,都称为 nmbrOfUnits。这可能会对您指的是哪个变量造成很多混淆。
如果希望变量是全局的,正确的写法是:
int g_nmbrOfUnits;
void input(int *p_nmbrOfUnits) {
printf("numnber if units: "); //typos in the original
scanf("%d", p_nmbrOfUnits);
}
然后在另一个函数中:
input(&g_nmbrOfUnits);