我制作了一个C程序,该程序试图使用单独的方法将一个字符串数组的值添加到另一个字符串数组:
#include <stdio.h>
#include <stdlib.h>
void charConv(char *example[])
{
example= (char* )malloc(sizeof(char[4])*6);
char *y[] = {"cat", "dog", "ate", "RIP", "CSS", "sun"};
printf("flagn");
int i;
i=0;
for(i=0; i<6; i++){
strcpy(example[i], y[i]);
}
}
int main() {
char *x[6];
charConv( *x[6]);
printf("%sn", x[0]);
}
但是,它继续返回分段故障。我刚刚开始学习如何使用malloc和c,这很困惑我找到解决方案。
要确定您的问题:您发送*x[6]
(此处-charConv( *x[6]);
),这是 7 'th(!!!)字符串的第一个字符(请记住,c是为零基数索引)在6个字符串的数组中,您没有malloc
->使用内存您不拥有的内存 -> ub。
我应该注意的另一件事是 char[]
vs char * []
。使用前者,您可以将strcpy
纳入IT字符串。看起来像这样:
'c' | 'a' | 't' | ' ' | 'd' | 'o' | 'g' | ... [each cell here is a `char`]
后者(您使用的)不是char
S的连续块,而是char *
的数组,因此您应该做的是为您的数组中的每个指针分配内存并将其复制到其中。看起来像:
0x100 | 0x200 | 0x300... [each cell is address you should malloc and then you would copy string into]
但是,您的代码也有几个问题。以下是一个固定版本,带有说明:
#include <stdio.h>
#include <stdlib.h>
void charConv(char *example[])
{
// example= (char* )malloc(sizeof(char[4])*6); // remove this! you don't want to reallocate example! When entering this function, example points to address A but after this, it will point to address B (could be NULL), thus, accessing it from main (the function caller) would be UB ( bad )
for (int i = 0; i < 6; i++)
{
example[i] = malloc(4); // instead, malloc each string inside the array of string. This can be done from main, or from here, whatever you prefer
}
char *y[] = {"cat", "dog", "ate", "RIP", "CSS", "sun"};
printf("flagn");
/* remove this - move it inside the for loop
int i;
i=0;
*/
for(int i=0; i<6; i++){
printf("%st", y[i]); // simple debug check - remove it
strcpy(example[i], y[i]);
printf("%sn", example[i]); // simple debug check - remove it
}
}
int main() {
char *x[6];
charConv( x); // pass x, not *x[6] !!
for (int i = 0; i < 6; i++)
{
printf("%sn", x[i]); // simple debug check - remove it
}
}
正如@michaelwalz所述,使用硬编码值不是一个好习惯。我把它们留在这里,因为这是一个小片段,我认为它们很明显。不过,请尝试避免它们
您需要首先了解指针和其他一些主题,例如如何将一系列字符串传递给C等的功能。在您的程序中,您在CharConv()中传递 *x [6],这是一个字符。
在您的程序中进行更正 -
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void charConv(char *example[], int num)
{
int i;
for (i = 0; i < num; i++){
example[i] = (char* )malloc(sizeof(char)*4);
}
const char *y[] = {"cat", "dog", "ate", "RIP", "CSS", "sun"};
for(i = 0; i < num; i++){
strcpy(example[i], y[i]);
}
}
int main() {
char *x[6];
int i = 0;
charConv(x, 6);
/* Print the values of string array x*/
for(i = 0; i < 6; i++){
printf("%sn", x[i]);
}
return 0;
}