设置整数指针数组

时间:2013-07-03 17:58:22

标签: c arrays pointers indexing

我正在尝试设置一个整数指针数组。程序应该将索引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;
}

3 个答案:

答案 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 []的相应元素中,这是指向字符串的指针数组。 此解决方案的性能受到影响,因为我们需要分配内存然后进行复制