我正在尝试设置一个整数指针数组。程序应该将索引i处的指针设置为指向值2 * i的整数。程序然后应该打印出前5个指针元素的指针,它们应该是0,2,4,6,8。
出于某种原因,我遇到了分段错误。谁能告诉我为什么会发生这种情况以及我能做些什么来解决它?
我试图用“arr [index] =& i;”替换最后一行,这不会给我一个分段错误,但仍然给我错误的结果。
帮助将非常感激,只需从指针数组开始。
#include <stdio.h>
void setArr (int);
int * arr[10]; // array of 10 int pointers
int main(int argc, char *argv[])
{
int i;
setArr(0);
setArr(1);
setArr(2);
setArr(3);
setArr(4);
for(i=0; i<5;i++)
printf("arr [%d] = %d\n", i, *arr[i]); /* should be 0, 2, 4, 6, 8 */
return 0;
}
/* set arr[index], which is a pointer, to point to an integer of value 2*index */
void setArr (int index){
int i = 2 * index;
* arr[index] = i;
}
答案 0 :(得分:2)
问题是你没有为数组中每个项指向的内容分配内存。这条线
*arr[index] = i;
会将一些随机内存地址(最初在arr[index]
中)设置为i
的值。
你应该做的是:
void setArr(int index)
{
int *i = malloc(sizeof(int)); // allocate memory for the value
*i = 2 * index; // set the value
arr[index] = i; // make the array slot point at the value
}
但您需要确保稍后free()
内存。例如,在return 0;
函数中的main()
语句之前,请输入:
for (i = 0; i < 5; i++)
free(arr[i]);
答案 1 :(得分:0)
你需要在数组中使用malloc空间作为指针。
答案 2 :(得分:0)
这取自Yashavant P. Kanetkar的让我们“C”的第9章,并且应该澄清为什么你之前所做的不起作用。
当我们使用二维数组字符时,我们可以自由地初始化我们声明数组的字符串,或者使用scanf()函数接收字符串。但是,当我们使用指向字符串的指针数组时,我们可以在声明数组的位置初始化字符串,但是我们无法使用scanf()从键盘接收字符串。因此,以下程序永远不会成功。
main( )
{
char *names[6] ;
int i ;
for ( i = 0 ; i <= 5 ; i++ )
{
printf ( "\nEnter name " ) ;
scanf ( "%s", names[i] ) ;
}
}
该计划不起作用,因为;当我们声明数组时,它包含垃圾值。将这些垃圾值发送到scanf()作为应该保持从键盘接收的字符串的地址肯定是错误的。 解 如果我们倾向于使用scanf()从键盘接收字符串,然后将它们的地址存储在指向字符串的指针数组中,我们可以采用稍微圆整的方式进行,如下所示。
#include "alloc.h"
main( )
352 Let Us C
{
char *names[6] ;
char n[50] ;
int len, i ;
char *p ;
for ( i = 0 ; i <= 5 ; i++ )
{
printf ( "\nEnter name " ) ;
scanf ( "%s", n ) ;
len = strlen ( n ) ;
p = malloc ( len + 1 ) ;
strcpy ( p, n ) ;
names[i] = p ;
}
for ( i = 0 ; i <= 5 ; i++ )
printf ( "\n%s", names[i] ) ;
}
这里我们首先在字符串n []中使用scanf()接收名称。然后我们使用strlen()找到了它的长度,并分配了空间来制作这个名字的副本。这种内存分配是使用名为malloc()的标准库函数完成的。此函数需要分配的字节数,并返回它分配的内存块的基址。此函数返回的地址始终为void *类型。因此,它已使用称为类型转换的功能转换为char *。类型转换将在第15章中详细讨论。此函数的原型已在文件“alloc.h”中声明。因此我们有#included这个文件。 但为什么我们不使用数组来分配内存?这是因为对于数组,我们必须在编写程序时提交数组的大小。而且,在程序执行期间无法增加或减少数组大小。换句话说,当我们使用数组时,会发生静态内存分配。 第9章:字符串上的Puppetting 353 与此不同,使用malloc()我们可以在执行期间动态分配内存。我们传递给malloc()的参数可以是一个变量,其值可以在执行期间更改。 一旦我们使用malloc()分配了内存,我们就将通过键盘接收的名称复制到这个分配的空间中,最后将分配的块的地址存储在names []的相应元素中,这是指向字符串的指针数组。 此解决方案的性能受到影响,因为我们需要分配内存然后进行复制