设置整数指针数组

问题描述 投票:0回答:3

我正在尝试设置一个整数指针数组。该程序应该将索引 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;
}
c arrays pointers indexing
3个回答
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]);

0
投票

您需要为数组内的指针分配空间。


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] ) ;
}

这里我们首先使用 scanf() 在字符串 n[ ] 中接收到一个名称。然后我们使用 strlen() 找出它的长度并分配空间来制作该名称的副本。该内存分配是使用名为 malloc() 的标准库函数完成的。该函数需要要分配的字节数并返回它分配的内存块的基地址。该函数返回的地址始终为 void * 类型。因此,它已使用称为类型转换的功能转换为 char *。第 15 章详细讨论了类型转换。该函数的原型已在文件“alloc.h”中声明。因此我们#included 这个文件。 但是为什么我们不使用数组来分配内存呢?这是因为对于数组,我们必须在编写程序时承诺数组的大小。而且,在程序执行期间无法增加或减少数组大小。换句话说,当我们使用数组时,会发生静态内存分配。 第9章:提线木偶353 与此不同的是,使用 malloc() 我们可以在执行期间动态分配内存。我们传递给 malloc() 的参数可以是一个变量,其值可以在执行期间更改。 一旦我们使用malloc()分配了内存,我们就将通过键盘接收到的名称复制到这个分配的空间中,最后将分配块的地址存储在names[](指向字符串的指针数组)的适当元素中。 该解决方案的性能会受到影响,因为我们需要分配内存然后进行复制

© www.soinside.com 2019 - 2024. All rights reserved.