我真的很难让这段代码工作。我试图通过引用函数传递数组,以便在该函数中修改它。然后我需要将修改交还给原来的调用函数。
我在这里搜索过类似的问题,但找不到任何可以像我想要的那样成功运行的东西。
这是我的代码,我真的很感激任何帮助。非常感谢:
#include <stdio.h>
#include <stdlib.h>
#define SIZE_OF_VALUES 5
#define SIZE_OF_STRING 100
void set_values(char **values);
void set_values(char **values)
{
*values = malloc(sizeof(char)*SIZE_OF_VALUES);
for (int i = 0; i < (sizeof(char)*SIZE_OF_VALUES); i++) {
values[i] = malloc(sizeof(char)*SIZE_OF_STRING);
values[i] = "Hello";
//puts(values[i]); //It works fine here.
}
}
int main (int argc, const char * argv[])
{
char *values;
set_values(&values);
for (int i = 0; i < (sizeof(char)*SIZE_OF_VALUES); i++) {
puts(values[i]); //It does not work!
}
return 0;
}
答案 0 :(得分:3)
您的代码存在一些问题:
您应该有三个级别的指针 - void set_values(char ***values)
,将其作为“*
的参考(第一个*
)读取{{1 (第三个char*
)“
*
中的每个元素都应该是指针(*values
)而不是char*
,因此您需要:
char
您正在泄漏内存,首先进行mallocing然后分配文字,另外不要取消引用*values = malloc(sizeof(char*)*SIZE_OF_VALUES);
,您需要:
values
或
(*values)[i] = "Hello";
或
(*values)[i] = strdup("Hello"); // you will have to free it later
在(*values)[i] = malloc(sizeof(char)*SIZE_OF_STRING); // you will have to free this as well
strcpy((*values)[i], "Hello");
中,您应该声明main
,因为它是指向char **values;
数组的指针(字符串/数组)。
在循环中,您错误地将索引乘以char*
,索引在元素中计算,而不是以字节为单位。因此,您需要:
sizeof
最后不要忘记释放记忆。
答案 1 :(得分:0)
使用char ***
类型作为set_values
功能的参数:
#include <stdio.h>
#include <stdlib.h>
#define SIZE_OF_VALUES 5
void set_values(char ***values)
{
*values = malloc(sizeof (char *) * SIZE_OF_VALUES);
for (int i = 0; i < SIZE_OF_VALUES; i++) {
(*values)[i] = "Hello";
}
}
int main (int argc, char *argv[])
{
char **values;
set_values(&values);
for (int i = 0; i < SIZE_OF_VALUES; i++) {
puts(values[i]);
}
return 0;
}
当然,您必须在退出main之前检查malloc
返回值和free
分配的内存。
答案 2 :(得分:0)
char *
是char的一维数组。但是您希望set_values
中的代码将值设置为二维数组。
为了使这项工作,定义:
值为char **values;
set_values为void set_values(char ***values)
为char数组分配指针:
*values = malloc(sizeof(char*)*SIZE_OF_VALUES);
除了你的循环有点奇怪:
for (int i = 0; i < (sizeof(char)*SIZE_OF_VALUES); i++) {
应替换为
for (int i = 0; i < SIZE_OF_VALUES; i++) {
最后,如果要将字符串复制到现在分配的数组中,请使用
strncpy((*values)[i], "Hello", SIZE_OF_STRING-1);
(*values)[i][SIZE_OF_STRING-1] = '\0';
总的来说:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE_OF_VALUES 5
#define SIZE_OF_STRING 100
void set_values(char ***values);
void set_values(char ***values)
{
const char * content = "Hello";
*values = malloc(sizeof(char*)*SIZE_OF_VALUES);
for (int i = 0; i < SIZE_OF_VALUES; i++) {
(*values)[i] = malloc(sizeof(char)*SIZE_OF_STRING);
strncpy((*values)[i], content, SIZE_OF_STRING-1);
(*values)[i][SIZE_OF_STRING-1] = '\0';
if(strlen(content) >= SIZE_OF_STRING){
fprintf(stderr,"Warning content string did not fit into buffer!\n");
}
}
}
int main (int argc, const char * argv[])
{
char **values;
set_values(&values);
for (int i = 0; i < SIZE_OF_VALUES; i++) {
printf("%s\n", values[i]);
}
for (int i = 0; i < SIZE_OF_VALUES; i++) {
free(values[i]);
}
free(values);
return 0;
}
答案 3 :(得分:0)
这是解决方案。
void set_values(char ***values)
{
int i;
char ** val;
val = *values = (char**)malloc(sizeof(char*)*SIZE_OF_VALUES);
for (i = 0; i < (sizeof(char)*SIZE_OF_VALUES); i++)
val[i] = "Hello";
}
int main (int argc, const char * argv[])
{
char **values;
int i;
set_values(&values);
for (i = 0; i < (sizeof(char)*SIZE_OF_VALUES); i++)
puts(values[i]);
return 0;
}
答案 4 :(得分:-3)
此行中还有一个*
:
*values = malloc(sizeof(char)*SIZE_OF_VALUES);
应该是:
values = malloc(sizeof(char)*SIZE_OF_VALUES);
此外,您的主要内容存在相当大的问题,char* values
应为char** values
,通过引用(char* values
)传递set_values(&values);
可能会导致我怀疑的分段错误。
为了影响外部数组,它已经受到影响,因为当传递给函数时,您只复制指向同一位置的指针,因此修改将影响相同的内存块。