簡體   English   中英

C-我的代碼有什么問題(malloc,char *)

[英]C - What's wrong with my code (malloc, char*)

我只想讓您問一下這段代碼我做錯了什么。 我編寫了一個在參數中帶有char *的函數,我想直接對其進行修改而不返回smthg,並反轉字符串。

#include <iostream>

void reverseString(char *p_string){

    int length = strlen(p_string);
    int r_it = length - 1;
    char* tmp = (char*)malloc(length);
    int last_it = 0;

    for (int i = 0; i != length; i++){
        tmp[i] = p_string[r_it];
        r_it--;
        last_it++;
    }
    tmp[last_it] = '\0';

    strcpy_s(p_string, length + 1, tmp);
    //free(tmp);
}

int main(){

    char str[] = "StackOverflow";

    reverseString(str);

    std::cout << str << std::endl;

    system("pause");
}

我已經習慣了C ++,並且不經常使用C函數,例如malloc / free / strcpy ...在這里,我的問題是,當我為臨時char分配內存時,我在這里以length = 13的方式調用了Mallec(length)情況下,char = 1個字節,因此應該為13個char分配內存,對嗎?

問題是分配了比需要更多的空間,因此我需要在我的strcpy_s之前使用“ \\ 0”,否則它不會中斷。

我在某個地方犯錯了嗎? 另外,當我調用free(tmp)時,它也會中斷並說堆損壞,但是在此之前我沒有釋放內存。

感謝您的幫助!

我使用了原始代碼,並在malloc的大小上添加了一個簡單的“ +1”,並獲得了通過的結果。

不知道您的練習是否專門與malloc的使用有關,但是您是否考慮過直接在原始字符串中進行反轉?

例如:

void reverseString(char *p_string){

    char* p_end = p_string+strlen(p_string)-1;
    char t;

    while (p_end > p_string)
    {
        t = *p_end;
        *p_end-- = *p_string;
        *p_string++ = t;
    }
}

int main(){

    char str[] = "StackOverflow";

    reverseString(str);

    std::cout << str << std::endl;

    system("pause");
}

如果需要使用malloc,則需要確保為包含'\\ 0'的字符串分配足夠的空間。

您必須使用

int length = strlen(p_string);
int r_it = length - 1;
char* tmp = (char*)malloc(length+1);

由於strlen不會計算\\ 0字符。 因此,如果您不使用length + 1,這將失敗:

tmp[last_it] = '\0';

C字符串的長度由終止的空字符確定:AC字符串的長度與字符串開頭和終止的空字符之間的字符數一樣長(不包括終止的空字符本身)。 http://www.cplusplus.com/reference/cstring/strlen/

順便說一句。 C99支持半動態數組。 所以你可以嘗試一下:

char tmp[length+1];

資料來源: http : //en.wikipedia.org/wiki/Variable-length_array

float read_and_process(int n)
{
    float vals[n];

    for (int i = 0; i < n; i++)
        vals[i] = read_val();
    return process(vals, n);
}

檢查以下C代碼:分配給tmp的內存應為length + 1,如下所示,並且還有許多不必要的變量可以避免。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void reverseString(char *p_string){

   int i;
   int length = strlen(p_string);
   int r_it = length - 1;
   char* tmp = (char*)malloc(length+1);

   for (i = 0; i != length; i++){
      tmp[i] = p_string[r_it--];
   }   
   tmp[i] = '\0';

   strcpy(p_string, tmp);
   return;

}

int main(){

   char str[] = "StackOverflow";

   reverseString(str);

   printf("%s",str);
   return 0;

}

您的方法從根本上沒有什么錯,只有一些細節。 由於我不確定您是如何發現sizeof(tmp)為32的,因此我將代碼修改為以下代碼,其中包括一些printf和一些小的更改:

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

void reverseString(char *p_string)
{
  size_t length = strlen(p_string);
  size_t r_it = length - 1;
  char* tmp = (char*)malloc(length+1);
  int last_it = 0;
  size_t i=0;

  printf("strlen(p_string) = %d\n", strlen(p_string));
  printf("Before: strlen(tmp) = %d\n", strlen(tmp));

  for (i = 0; i != length; i++) {
    tmp[i] = p_string[r_it];
    r_it--;
    last_it++;
  }

  tmp[last_it] = '\0';

  printf("After: strlen(tmp) = %d\n", strlen(tmp));

  strcpy(p_string, tmp);

  free(tmp);
}

int main()
{
  char str[] = "StackOverflow";

  reverseString(str);

  printf("%s\n", str);

  return 0;
}

首先,我刪除了所有C ++特定的代碼-您現在可以使用gcc 運行以下代碼將產生以下輸出:

sizeof(p_string) = 13
Before: strlen(tmp) = 0
After: strlen(tmp) = 13
wolfrevOkcatS

這是可以預期的strlen基本上strlen數字節,直到它到達\\0字符為止,因此,第一次使用strlen打印大小時,由於我們剛剛分配了內存,因此它返回0。 正如另一個建議的那樣,我們必須分配1個額外的字節來將\\0存儲在新字符串中。

一旦完成反向操作,就會將13個字節復制到該內存中,並且第二個strlen返回預期的答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM