使用另一个指针变量char*c-c操作和访问char*s的指针变量(字符串)



当我试图在将字符串"存储"为指针变量时操纵字符串时,遇到了一个障碍。

// Sample code to input a string till line break is encountered, later re-allocating to save space
char *s = malloc(1024 * sizeof(char));
scanf("%[^n]", s);
s = realloc(s, strlen(s) + 1);
// Code to replace whitespaces with newlines
for (char *c = s; *c != ''; c++) {
if (*c == ' ') {
*c = 'n';
}
}
printf("%s", s);

我想在上面的代码片段中解释char *c = s,因为当我试图使用相同的概念来迭代中的字符串时,另一个例子(下面(中的字符串字符时,我遇到了Segmentation fault运行时错误。

我想从用户输入的字符串中找到数字(0到9(的频率:

int count[10];
char *s = malloc(1024 * sizeof(char));
scanf("%[^n]", &s);
s = realloc(s, strlen(s) + 1);
for(char *c = s; *c != ''; c++) {  // Shows Segementation fault here
if(*c >= '0' && *c <= '9') {
count[*c - '0'] += 1;  // I am still trying to work this
}
}

scanf中,您正在使用&s而不是s

char *c = s:的解释

在该语句中,指针c被设置为与for循环的第一次迭代的指针s相同的地址。这意味着,c和s指向相同的内存位置。然后,对于for循环的每一次进一步迭代,c都会递增(c++(,并且只要取消引用的内存位置(内存位置的内容(不是空字符,就执行for循环。

现在对于分段错误,由于您没有发布不起作用的代码,我只能猜测。一种猜测可能是,分配的内存中没有空字符,因此for循环停止得不够快,并将c指针增加到比malloc分配的地址更高的地址。通过取消引用它,您可以访问分配内存之外的内存位置。这可能会产生分段故障。

编辑:啊,现在我看到你添加了不工作的代码。是的,Akshay的答案是对的,分段错误可能已经发生在那里了,因为你不扫描到s,而是扫描到保存指针变量的内存位置。s指向的数组仍然未初始化(未知值(,但您使用strlen搜索第一个出现的null字符。现在,realloc可能会失败,从而返回NULL,然后将c指针设置为NULL。这也会产生分割错误。

最新更新