char *values[2];
上面的行被解析为char *(values[2]);,即[]优先于*。这意味着 values 是一个包含 2 个元素的数组。元素的类型是char *。所以,values[0] 和 values[1] 的类型是 char *。由于您尚未初始化数组元素,因此数组中的两项具有未知的随机值。
//sprintf(values,"%d" "%d",i,j);
尽管您已对此进行了注释,但您似乎正在尝试使用一个 sprintf 调用将 i 和 j 的字符串表示形式存储到 values 中。您可能已经发现,这是不可能的。
sprintf(&values[0],"%d" ,i);
在这里,您调用sprintf 将i 的字符串表示形式存储到values[0] 指向的内存位置。但如上所述,values[0] 没有指向任何有用的地方,因为您还没有初始化它。这很糟糕。
sprintf(&values[1],"%d" ,j);
同上。
method2(values, 2);
在这里,您正在调用method2,但您尚未声明method2 的签名。事实证明,method2 需要一个 char * 和一个 int。您正在传递values 和2。 values 是 char * 的数组,在此上下文中它被转换为指针,因此 method2 应该采用 char ** 和 int。
int method2(char *strings, int num_values){
这应该是:int method2(char **strings, int num_values) {
int i, j;
char buffer[256];
sscanf(buffer, "%d" "%d", &i, &j);
我不确定您要在这里做什么。您忽略了strings,而是使用buffer 变量。 buffer 未初始化,因此试图将其中的数据解释为两个整数是没有意义的。
我假设您编写这个程序是为了理解字符串、指针和函数。因此,没有一种正确的方法可以做你想做的事情。但这里有一种方法:
#include <stdio.h>
/* Define method2 before method1, so that its definition is visible
in method1 */
/* Assume that method2 will be called with one char * containing two integer
values. I also changed the return type to void since you weren't really
using the int return value. Same for method1. */
void method2(const char *strings)
{
int i, j;
sscanf(strings, "%d %d", &i, &j);
printf("i: %d, j: %d\n",i,j);
}
void method1(void)
{
/* Changed values to a char array that has enough space */
char values[256];
int i = 1298;
int j = 9;
sprintf(values, "%d %d", i, j);
method2(values);
}
int main(void)
{
method1();
return 0;
}
以上输出:
i: 1298, j: 9
您的程序中有很多活动部分。我建议您在将指针、数组等用 C 语言传递给函数之前,先学习它们的基础知识。