此代码有什么问题?
void input(int *nmbrOfUnits);
int main() {
int *nmbrOfUnits;
input(nmbrOfUnits);
}
void input(int *nmbrOfUnits) {
printf("numnber if units: ");
scanf(" %d", nmbrOfUnits);
}
编辑:变量是在main中创建的,这应该意味着如果主调用输入变量没有从堆栈中加载。我为什么要在堆上分配它? 我传递一个指针并在scanf中使用它。为什么我在这里遇到分段错误?
答案 0 :(得分:5)
指针应指向将写入值的内存。例如
int *nmbrOfUnits = malloc( sizeof( int ) );
或
int x;
int *nmbrOfUnits = &x;
另一种方法是允许函数本身分配指针指向的mamory。例如
void input( int **nmbrOfUnits )
{
*nmbrOfUnits = malloc( sizeof( int ) );
if ( *nmbrOfUnits != NULL )
{
printf( "numnber if units: " );
scanf( " %d", *nmbrOfUnits );
}
}
//...
int *nmbrOfUnits;
//...
input( &nmbrOfUnits );
答案 1 :(得分:2)
在您的代码中
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;
然后,将其传递给其他函数。