我有一个函数,里面有两个数组。 在第一个循环中,我将指针初始化为NULL 在第二个循环中,我将每个指针设置为指向另一个数组中的一个字符。所以在指针数组的位置[0]中有一个指向字符数组位置[0]等的字符指针。 在第三个循环中,我打印出每个字符的值和内存位置。
但是,我的代码没有按预期工作,导致IDE崩溃:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
void printName(char *pointer);
int main (void)
{
char *name = "Example";
printName(*name);
return 0;
}
void printName(char *pointer)
{
char arrayOfChars[10];
char arrayOfPointers[10];
for(int i = 0; i < 10; i++)
{
arrayOfPointers[i] = NULL;
}
for(int i = 0; i <= 10; i++)
{
arrayOfPointers[i] = &arrayOfChars[i];
}
for (int i = 0; i <= 10; ++i)
{
printf("Value: %d, addr: %p\n", pointer[i], pointer+i);
}
}
答案 0 :(得分:1)
你有几个错误,第一个是@George在评论中指出的:
char *name = "Example";
printName(*name);
return 0;
}
void printName(char *pointer)
printName
期待指向char
的指针,但您正在通过(由于取消引用*
)一个char
,只是通过printName(name);
在这里:
arrayOfPointers[i] = NULL;
您正在指定一个指向char
同样适用于
arrayOfPointers[i] = &arrayOfChars[i];
如果你想要一个指针数组(如评论所示),请使用
char arrayOfChars[10];
char *arrayOfPointers[10];
此外,您需要检查循环中的尾随NUL
字符,因为您正在读取数组的边界之外。
答案 1 :(得分:0)
您的问题出在主要功能
中int main (void)
{
char *name = "Example";
printName(*name);
return 0;
}
变化
printName(*name);
到
printName(name);
因为printName
函数需要pointer
,不是解除引用的值
另外,这个
char arrayOfPointers[10];
不是指针数组。 将其更改为
char *arrayOfPointers[10];
答案 2 :(得分:0)
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
void printName(char *pointer);
int main (void)
{
char *name = "Example";
printName(name);
return 0;
}
void printName(char *pointer)
{
int i;
char arrayOfChars[10];
char arrayOfPointers[10];
// set values to null
for(i = 0; i < 10; i++)
{
arrayOfPointers[i] = NULL;
}
// set each pointer to point to one character in the other array
for(i = 0; i < 10; i++)
{
arrayOfPointers[i] = &arrayOfChars[i];
}
// print value and memory location:
for (i = 0; i < 10; ++i)
{
printf("Value: %d, addr: %p\n", pointer[i], pointer+i);
}
}
试试这段代码吧。你正在多次初恋我可能是错误。并且还将名称传递给funtion而不是* name,因为我们必须传递地址而不是该地址的值
答案 3 :(得分:0)
更改:printName(* name); to printName(name);因为你已经将它定义为指针数组
在定义arrayOfPointers时,请确保将其定义为指针数组: char * arrayOfPointers [10]; 这是为了避免转换错误。
此外,如果要打印char值而不是ASCII值:使用%c更改%d: printf(“值:%c,addr:%p \ n”,指针[i],指针+ i);
注意:您的代码使用静态数组大小而不是动态。因此,打印“示例”地址时将获得的最后三个值将是垃圾值。