簡體   English   中英

在 strcpy() 返回值上讀取字符串字符時出錯

[英]Error reading charcters of string on the strcpy() return value

我試圖打印出strcpy() 的返回值,它給了我一個“訪問沖突讀取位置”異常。

char ind[15]; 
printf("%s\n", strcpy(ind, "source text"));

或使用調試語句:

char* ins = "source text";
char* dst;
dst = strcpy(ind, ins);
printf("dst = %s", dst);

Visual Studio 顯示 ind = 0x00000024ec71f448 "源文本" 而 dst = 0xffffffffec71f448 <Error reading characters of string.> <Unable to read memory> 。

不應該 dst = ind 嗎? 指向同一個地址?

Great answers, all! 如果沒有 <string.h>,當我將鼠標懸停在 strcpy 上時,它默認為“int strcpy()”。 包含 <string.h> 后,它顯示“char *strcpy()”。

關於地址值,我的 PC 運行 64 位 Windows 10。由於“int”在大多數 64 位平台上通常是 32 位,因此 dst 的上限為 32 位,而假的高 32 位。

一個問題是,為了使用 Visual Studio 構建,您必須在所有 #include .h 之上添加#define _CRT_SECURE_NO_WARNINGS以避免編譯器錯誤。 原因是 VS 建議使用errno_t strcpy_s(...)而不是 strcpy()。 但是 strcpy_s() 將返回一個值 if 成功。 這使得我們的 dst = 0,一個 NULL 指針,而 #define 有助於繞過它。

在所有修復之后,dst = ind = 0x000000249d8ff528 “源測試”。 謝謝。

如果您未能#include <string.h>可能會發生這種情況

如果沒有strcpy的聲明,編譯器將使用int strcpy()的隱式聲明。 這與實際的返回類型不兼容。 通過不兼容的類型調用函數會觸發未定義的行為

在這種特殊情況下, int小於char * 這就是函數的返回值在調試器中出現截斷的原因。 結果是一個無效的指針值,當您嘗試取消引用該無效指針時,您讀取了一個觸發崩潰的無效內存頁面。

暫無
暫無

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

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