Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';我的c代码怎么了?(这可能是malloc调用)_C_String_Pointers_Malloc - Fatal编程技术网

什么';我的c代码怎么了?(这可能是malloc调用)

什么';我的c代码怎么了?(这可能是malloc调用),c,string,pointers,malloc,C,String,Pointers,Malloc,当我运行这段代码时,我得到了一个分段错误。我肯定我做的指针是错误的,但我不知道为什么或如何修复它。 我还包括了我试图以图片形式回答的问题。 #包括 #包括 字符*重复字符(字符*s,整数n){ printf(“%s”,*s); 焦炭温度; 整数长度=0; int i=0; int j=0; int k=0; char*新闻字符串; 而(s[长度]){ 长度++; printf(“%d”,长度); }//查找字符串的长度 newString=(char*)malloc(长度*n*sizeof(c

当我运行这段代码时,我得到了一个分段错误。我肯定我做的指针是错误的,但我不知道为什么或如何修复它。 我还包括了我试图以图片形式回答的问题。

#包括
#包括
字符*重复字符(字符*s,整数n){
printf(“%s”,*s);
焦炭温度;
整数长度=0;
int i=0;
int j=0;
int k=0;
char*新闻字符串;
而(s[长度]){
长度++;
printf(“%d”,长度);
}//查找字符串的长度
newString=(char*)malloc(长度*n*sizeof(char));
while(i++
作为提问者,你的工作之一就是证明问题所在。例如,以下情况会导致分段错误:

#include <stdio.h>

char * repeat_characters(char *s, int n) {
    printf("%s", *s);
    return NULL;
}

int main () {
    char * string[100];
    scanf("%s", string);

    repeat_characters(*string, 0);
    return 0; 
}
格式“%s”要求参数类型为“char*”,但参数2的类型为“int”

这里有一个参数
char*s
。根据上下文,可以是指向单个字符的指针,也可以是指向多字符序列的第一个字符的指针

C字符串按照约定进行操作,即它是一个多字符序列,字符范围最终以
'\0'
(或0值字符)终止。因此,当您调用
printf
时,您必须确保传入的字符指针指向这样一个有效格式的序列

您正在传入
*s
,这将取消对字符指针的引用,使其成为单个字符。如果要打印单个字符,则需要使用
%c
,例如
printf(“%c”,*s)。但是您想要打印一个C字符串,所以您应该删除取消引用的
*
,只需说
printf(“%s\n”,s)
。(您可能希望
\n
输出换行符,否则您的打印将一起运行。)

(注意:当您传递一个字符时,没有警告的C之所以没有抱怨,是因为像
printf
scanf
这样的函数“古怪”。它们没有固定数量或类型的参数,因此检查较少……警告有助于弥补不足。)

格式“%s”要求参数类型为“char*”,但参数2的类型为“char**”

这里的问题是,您将s声明为
char*string[100],它是字符指针数组,而不是字符数组。C数组的二元性能够像指针一样指向它的第一个元素需要一些时间来适应,但是如果你说
charstring[100]
字符串[0]
字符
字符串
可以“衰减”为
字符*
字符串[0]
同义:

while(i++
“i”上的操作可能未定义

编译器在这里提出了一项技术投诉,关于在同样使用
i
的表达式中修改变量
i
。它警告
i*n
中的
i
是否会看到增量之前或之后的值。避免这种表达……当你关心你能做什么和不能做什么的时候,读一读

但是把它放在一边。你来这儿有什么打算?把
++
的细微差别去掉……当(i
的时候,
怎么样?什么时候会是错误的?为什么它与解决问题相关

仔细查看您的代码,也许可以尝试对其进行更多注释。什么是“不变量”,或者你可以声称变量在每一行上都是真的?如果你被要求为代码为什么工作辩护——没有编译器来运行它——那么什么能让你确信它做了正确的事情

然后使用调试器和示例逐步完成,并检查您的直觉。如果你跨过了一条线,却没有得到你所期望的,那么也许是时候开始思考一个问题了,这个问题会把注意力吸引到这条线上


注释中还提出了其他问题(例如,您的malloc()不包含用于终止符的空间,即使为该空间添加了1,您仍然必须在其中写入
'\0'
)。一般来说,您的程序执行的
free()
s应该与执行的
malloc()
s一样多。等等,但希望这能为你指明正确的任务方向。

M.M所说的,再加上请使用tab,我几乎无法分辨一个函数中有什么,不容易阅读。话虽如此,请查看如何使用malloc。哇!那太粗鲁了。代码在我的文本编辑器中正确显示。对不起,这里的格式不对。我已经试着查找如何使用malloc,显然我不明白,否则我就不会在这里发布。感谢您的帮助…
while(i++
=>
while(i++
并在每次
while(j++
之前将
j
重置为0当我放置#符号时,它导致include以粗体显示,而不是正常显示。有没有一个格式化代码我需要包括,使我的代码显示的方式,它在一个文本编辑器?内奥米,请阅读。还有@MattClark。。。如果你想这样做,那么就不要把它缩进4,留两倍的行距,在文本中留下注释,比如“the
#
非常漂亮的@HostileFork,我认为“char*string[100]”是字符指针数组,但我同意
#include <stdio.h>

char * repeat_characters(char *s, int n) {
    printf("%s", *s);
    return NULL;
}

int main () {
    char * string[100];
    scanf("%s", string);

    repeat_characters(*string, 0);
    return 0; 
}
   printf("%s", *s);
   scanf("%s", string);
   while(i++ < i*n)