我有一个指针:
char * name;
它包含字符串"test:case"
我正在用它调用另一个函数,并试图将它存储在一个结构中。但是,我想首先将整个字符串大写,但它似乎不起作用。
void func(char * name) {
int i;
List * l;
l = malloc(sizeof(List));
for(i=0; i< strlen(name); i++) {
name[i] = toupper(name[i]);
}
l->name = name;
//CALL A FUNCTION TO LATER FREE ALLOCATED MEMORY
}
List is a struct that has a member (char *) named name.
然而,这是seg故障。在我的情况下,我无法使用非指针。因为我必须使用指针而不是字符数组,所以我试图在char指针的每个值中使用toupper,但是这似乎不起作用。
答案 0 :(得分:1)
您正在获得段错误,因为原始字符串可能是字面值,并且它不可修改。你需要先复制它。
.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
请注意,当您稍后免费void func(char * name) {
List * l;
l = malloc(sizeof(List));
name = strdup(name); // make a copy of name
for (char *p = name; *p; p++) {
*p = toupper(*p);
}
l->name = name;
}
时,您首先需要免费l
。
答案 1 :(得分:0)
由于您只将指针l->name
设置为name
,因此当原始name
不再存在(也许它只在堆栈上?)和{{ 1}}被访问。您需要l->name
空格malloc()
的大小,复制strlen(name)+1
并将name
设置为该地址。
答案 2 :(得分:0)
您已分配了List,但未分配名称字符串本身。 你需要这样做:
l=malloc(sizeof(List));
l->name=(char*)malloc(strlen(name)+1); // You need to cater for the the final null char.
您的代码还有一些其他问题,这里是正确的(没有编译它,可能接近正常):
void func(char *name) {
List * l;
l = (List*)malloc(sizeof(List));
l->name = (char*)malloc(strlen(name)+1);
for(char *r=name, char *w=l->name; *r; ++r,++w) {
*w = toupper(*r);
}
*++w='\0';
}
并且在每次迭代时,此代码都不会一次又一次地评估strlen,这将是非常糟糕的。
答案 3 :(得分:0)
代码中有两个错误。
char * name
变量 name 包含指向字符串的指针(即 char 的数组)。 当你这样写:
name[i] = toupper(name[i]);
如果它不是指向常量字符串的指针,那么您正在更改字符串的原始 char itens。如果是这种情况,那就是分段错误。
另一个错误在于:
l->name = name;
您只是在结构中为变量指定通过变量 name 传递给函数的指针。你应该复制一份,如下:
strcpy(l->name, name);
此函数将第二个参数中的所有内容复制到第一个参数。
但这不是一个好的解决方案。如果 name 包含指向常量字符串的指针,则它仍然是分段错误。
我会重写你的代码:
void func(char * name) {
int i;
List * l;
l = malloc(sizeof(List));
char *buffer[strlen(name)]; //buffer of the contents pointed by *name* to upper case, initialized as empty string
for(i=0; i< strlen(name); i++) {
buffer[i] = toupper(name[i]);
}
buffer[i] = '\0'; //closing the string in i = strlen(name)
strcpy(l->name, buffer);
//CALL A FUNCTION TO LATER FREE ALLOCATED MEMORY
}
这样,您可以操作原始字符串的副本,而不是将缓冲区的副本复制到结构中的变量。
如果你这样做:
l->name = buffer;
你只是复制一个本地指针,它将在函数结束时消失。
我建议你在C中学习更多关于指针,数组和字符串的知识。本质上,字符串是一个char数组,在最终位置有一个'\ 0'。空字符串 s 在s [0]中有'\ 0'。
编辑:如果您习惯于制作字符串副本的语言:
string1 = string2
你应该始终记住,在C中,那是指针赋值。所以,在C中,代码必须这样编写:
strcpy(string1, string2);
希望有所帮助。